exiftool_vendored 13.10.0 → 13.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/Changes +33 -0
- data/bin/MANIFEST +1 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +3 -3
- data/bin/exiftool +206 -148
- data/bin/lib/File/RandomAccess.pm +1 -1
- data/bin/lib/File/RandomAccess.pod +2 -2
- data/bin/lib/Image/ExifTool/AAC.pm +1 -1
- data/bin/lib/Image/ExifTool/AES.pm +1 -1
- data/bin/lib/Image/ExifTool/AFCP.pm +1 -1
- data/bin/lib/Image/ExifTool/AIFF.pm +1 -1
- data/bin/lib/Image/ExifTool/APE.pm +1 -1
- data/bin/lib/Image/ExifTool/APP12.pm +1 -1
- data/bin/lib/Image/ExifTool/ASF.pm +1 -1
- data/bin/lib/Image/ExifTool/Apple.pm +1 -1
- data/bin/lib/Image/ExifTool/Audible.pm +1 -1
- data/bin/lib/Image/ExifTool/BMP.pm +1 -1
- data/bin/lib/Image/ExifTool/BPG.pm +1 -1
- data/bin/lib/Image/ExifTool/BZZ.pm +1 -1
- data/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +6 -6
- data/bin/lib/Image/ExifTool/CBOR.pm +1 -1
- data/bin/lib/Image/ExifTool/Canon.pm +8 -4
- data/bin/lib/Image/ExifTool/CanonCustom.pm +1 -1
- data/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
- data/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
- data/bin/lib/Image/ExifTool/Casio.pm +1 -1
- data/bin/lib/Image/ExifTool/Charset.pm +1 -1
- data/bin/lib/Image/ExifTool/DICOM.pm +1 -1
- data/bin/lib/Image/ExifTool/DJI.pm +96 -45
- data/bin/lib/Image/ExifTool/DNG.pm +1 -1
- data/bin/lib/Image/ExifTool/DPX.pm +1 -1
- data/bin/lib/Image/ExifTool/DV.pm +1 -1
- data/bin/lib/Image/ExifTool/DarwinCore.pm +1 -1
- data/bin/lib/Image/ExifTool/DjVu.pm +1 -1
- data/bin/lib/Image/ExifTool/EXE.pm +123 -32
- data/bin/lib/Image/ExifTool/Exif.pm +7 -4
- data/bin/lib/Image/ExifTool/FITS.pm +1 -1
- data/bin/lib/Image/ExifTool/FLAC.pm +1 -1
- data/bin/lib/Image/ExifTool/FLIF.pm +1 -1
- data/bin/lib/Image/ExifTool/FLIR.pm +1 -1
- data/bin/lib/Image/ExifTool/Fixup.pm +1 -1
- data/bin/lib/Image/ExifTool/Flash.pm +1 -1
- data/bin/lib/Image/ExifTool/FlashPix.pm +1 -1
- data/bin/lib/Image/ExifTool/Font.pm +1 -1
- data/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
- data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -1
- data/bin/lib/Image/ExifTool/GE.pm +1 -1
- data/bin/lib/Image/ExifTool/GIF.pm +1 -1
- data/bin/lib/Image/ExifTool/GIMP.pm +1 -1
- data/bin/lib/Image/ExifTool/GM.pm +1 -1
- data/bin/lib/Image/ExifTool/GPS.pm +1 -1
- data/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
- data/bin/lib/Image/ExifTool/Geolocation.pm +1 -1
- data/bin/lib/Image/ExifTool/Geotag.pm +1 -1
- data/bin/lib/Image/ExifTool/GoPro.pm +1 -1
- data/bin/lib/Image/ExifTool/H264.pm +1 -1
- data/bin/lib/Image/ExifTool/HP.pm +1 -1
- data/bin/lib/Image/ExifTool/HTML.pm +1 -1
- data/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
- data/bin/lib/Image/ExifTool/ICC_Profile.pm +1 -1
- data/bin/lib/Image/ExifTool/ICO.pm +1 -1
- data/bin/lib/Image/ExifTool/ID3.pm +1 -1
- data/bin/lib/Image/ExifTool/IPTC.pm +8 -5
- data/bin/lib/Image/ExifTool/ISO.pm +1 -1
- data/bin/lib/Image/ExifTool/ITC.pm +1 -1
- data/bin/lib/Image/ExifTool/Import.pm +5 -4
- data/bin/lib/Image/ExifTool/InDesign.pm +1 -1
- data/bin/lib/Image/ExifTool/InfiRay.pm +1 -1
- data/bin/lib/Image/ExifTool/JPEG.pm +1 -1
- data/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
- data/bin/lib/Image/ExifTool/JSON.pm +1 -1
- data/bin/lib/Image/ExifTool/JVC.pm +1 -1
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +1 -1
- data/bin/lib/Image/ExifTool/Kodak.pm +1 -1
- data/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/LIF.pm +1 -1
- data/bin/lib/Image/ExifTool/LNK.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/sk.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
- data/bin/lib/Image/ExifTool/Leaf.pm +1 -1
- data/bin/lib/Image/ExifTool/LigoGPS.pm +408 -0
- data/bin/lib/Image/ExifTool/Lytro.pm +1 -1
- data/bin/lib/Image/ExifTool/M2TS.pm +22 -13
- data/bin/lib/Image/ExifTool/MIE.pm +1 -1
- data/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
- data/bin/lib/Image/ExifTool/MIFF.pm +1 -1
- data/bin/lib/Image/ExifTool/MISB.pm +1 -1
- data/bin/lib/Image/ExifTool/MNG.pm +1 -1
- data/bin/lib/Image/ExifTool/MOI.pm +1 -1
- data/bin/lib/Image/ExifTool/MPC.pm +1 -1
- data/bin/lib/Image/ExifTool/MPEG.pm +1 -1
- data/bin/lib/Image/ExifTool/MPF.pm +1 -1
- data/bin/lib/Image/ExifTool/MRC.pm +1 -1
- data/bin/lib/Image/ExifTool/MWG.pm +1 -1
- data/bin/lib/Image/ExifTool/MXF.pm +1 -1
- data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
- data/bin/lib/Image/ExifTool/MakerNotes.pm +1 -1
- data/bin/lib/Image/ExifTool/Matroska.pm +12 -4
- data/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
- data/bin/lib/Image/ExifTool/Minolta.pm +1 -1
- data/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/Motorola.pm +1 -1
- data/bin/lib/Image/ExifTool/Nikon.pm +164 -35
- data/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
- data/bin/lib/Image/ExifTool/NikonCustom.pm +1 -1
- data/bin/lib/Image/ExifTool/NikonSettings.pm +1 -1
- data/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
- data/bin/lib/Image/ExifTool/OOXML.pm +1 -1
- data/bin/lib/Image/ExifTool/Ogg.pm +1 -1
- data/bin/lib/Image/ExifTool/Olympus.pm +1 -1
- data/bin/lib/Image/ExifTool/OpenEXR.pm +1 -1
- data/bin/lib/Image/ExifTool/Opus.pm +1 -1
- data/bin/lib/Image/ExifTool/Other.pm +1 -1
- data/bin/lib/Image/ExifTool/PCX.pm +1 -1
- data/bin/lib/Image/ExifTool/PDF.pm +1 -1
- data/bin/lib/Image/ExifTool/PGF.pm +1 -1
- data/bin/lib/Image/ExifTool/PICT.pm +1 -1
- data/bin/lib/Image/ExifTool/PLIST.pm +1 -1
- data/bin/lib/Image/ExifTool/PLUS.pm +1 -1
- data/bin/lib/Image/ExifTool/PNG.pm +1 -1
- data/bin/lib/Image/ExifTool/PPM.pm +1 -1
- data/bin/lib/Image/ExifTool/PSP.pm +1 -1
- data/bin/lib/Image/ExifTool/Palm.pm +1 -1
- data/bin/lib/Image/ExifTool/Panasonic.pm +20 -2
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/Parrot.pm +1 -1
- data/bin/lib/Image/ExifTool/Pentax.pm +1 -1
- data/bin/lib/Image/ExifTool/PhaseOne.pm +1 -1
- data/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
- data/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
- data/bin/lib/Image/ExifTool/Photoshop.pm +1 -1
- data/bin/lib/Image/ExifTool/PostScript.pm +1 -1
- data/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
- data/bin/lib/Image/ExifTool/Protobuf.pm +24 -14
- data/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +46 -17
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +20 -302
- data/bin/lib/Image/ExifTool/README +4 -0
- data/bin/lib/Image/ExifTool/RIFF.pm +1 -1
- data/bin/lib/Image/ExifTool/RSRC.pm +1 -1
- data/bin/lib/Image/ExifTool/RTF.pm +1 -1
- data/bin/lib/Image/ExifTool/Radiance.pm +1 -1
- data/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
- data/bin/lib/Image/ExifTool/Real.pm +1 -1
- data/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
- data/bin/lib/Image/ExifTool/Red.pm +1 -1
- data/bin/lib/Image/ExifTool/Ricoh.pm +1 -1
- data/bin/lib/Image/ExifTool/Samsung.pm +1 -1
- data/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
- data/bin/lib/Image/ExifTool/Scalado.pm +1 -1
- data/bin/lib/Image/ExifTool/Shift.pl +1 -1
- data/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
- data/bin/lib/Image/ExifTool/Sigma.pm +1 -1
- data/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/Sony.pm +1 -1
- data/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
- data/bin/lib/Image/ExifTool/Stim.pm +1 -1
- data/bin/lib/Image/ExifTool/TagInfoXML.pm +2 -2
- data/bin/lib/Image/ExifTool/TagLookup.pm +11 -5
- data/bin/lib/Image/ExifTool/TagNames.pod +84 -34
- data/bin/lib/Image/ExifTool/Text.pm +1 -1
- data/bin/lib/Image/ExifTool/Theora.pm +1 -1
- data/bin/lib/Image/ExifTool/Torrent.pm +1 -1
- data/bin/lib/Image/ExifTool/Unknown.pm +1 -1
- data/bin/lib/Image/ExifTool/VCard.pm +1 -1
- data/bin/lib/Image/ExifTool/Validate.pm +1 -1
- data/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
- data/bin/lib/Image/ExifTool/WPG.pm +1 -1
- data/bin/lib/Image/ExifTool/WTV.pm +1 -1
- data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
- data/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
- data/bin/lib/Image/ExifTool/WritePNG.pl +1 -1
- data/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
- data/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +5 -3
- data/bin/lib/Image/ExifTool/WriteRIFF.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
- data/bin/lib/Image/ExifTool/Writer.pl +9 -8
- data/bin/lib/Image/ExifTool/XISF.pm +1 -1
- data/bin/lib/Image/ExifTool/XMP.pm +1 -1
- data/bin/lib/Image/ExifTool/XMP2.pl +1 -1
- data/bin/lib/Image/ExifTool/XMPStruct.pl +1 -1
- data/bin/lib/Image/ExifTool/ZIP.pm +1 -1
- data/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
- data/bin/lib/Image/ExifTool/iWork.pm +1 -1
- data/bin/lib/Image/ExifTool.pm +13 -7
- data/bin/lib/Image/ExifTool.pod +14 -5
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +3 -2
@@ -29,6 +29,7 @@ sub Process360Fly($$$);
|
|
29
29
|
sub ProcessFMAS($$$);
|
30
30
|
sub ProcessWolfbox($$$);
|
31
31
|
sub ProcessCAMM($$$);
|
32
|
+
sub OrderCipherDigits($$$;$);
|
32
33
|
|
33
34
|
# QuickTime data types that have ExifTool equivalents
|
34
35
|
# (ref https://developer.apple.com/library/content/documentation/QuickTime/QTFF/Metadata/Metadata.html#//apple_ref/doc/uid/TP40000939-CH1-SW35)
|
@@ -110,7 +111,7 @@ my %insvLimit = (
|
|
110
111
|
The tags below are extracted from timed metadata in QuickTime and other
|
111
112
|
formats of video files when the ExtractEmbedded option is used. Although
|
112
113
|
most of these tags are combined into the single table below, ExifTool
|
113
|
-
currently reads
|
114
|
+
currently reads 98 different types of timed GPS metadata from video files.
|
114
115
|
},
|
115
116
|
VARS => { NO_ID => 1 },
|
116
117
|
GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
|
@@ -146,7 +147,7 @@ my %insvLimit = (
|
|
146
147
|
CameraDateTime=>{ PrintConv => '$self->ConvertDateTime($val)', Groups => { 2 => 'Time' } },
|
147
148
|
DateTimeStamp =>{ PrintConv => '$self->ConvertDateTime($val)', Groups => { 2 => 'Time' } },
|
148
149
|
VideoTimeStamp => { Groups => { 2 => 'Video' } },
|
149
|
-
Accelerometer=> { Notes => '3-axis acceleration in units of g' },
|
150
|
+
Accelerometer=> { Notes => '3-axis acceleration, usually in units of g' },
|
150
151
|
AccelerometerData => { },
|
151
152
|
AngularVelocity => { },
|
152
153
|
GSensor => { },
|
@@ -354,8 +355,7 @@ my %insvLimit = (
|
|
354
355
|
Unknown01 => { Unknown => 1 },
|
355
356
|
Unknown02 => { Unknown => 1 },
|
356
357
|
Unknown03 => { Unknown => 1 },
|
357
|
-
|
358
|
-
H => { Name => 'Unknown_H', Unknown => 1 }, # (from LIGOGPSINFO)
|
358
|
+
MagneticVariation => { }, # (from LIGOGPSINFO)
|
359
359
|
);
|
360
360
|
|
361
361
|
# tags found in 'camm' type 0 timed metadata (ref 4)
|
@@ -1755,31 +1755,34 @@ sub ProcessFreeGPS($$$)
|
|
1755
1755
|
|
1756
1756
|
$debug and $et->FoundTag(GPSType => 5);
|
1757
1757
|
my $pos = length $1;
|
1758
|
-
# iiway s1 dual dash cam
|
1758
|
+
# iiway s1 dual dash cam - offset 16, encrypted and fuzzed with scale 1
|
1759
1759
|
# 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 03 00 00 [..@.freeGPS ....]
|
1760
1760
|
# 0010: 4c 49 47 4f 47 50 53 49 4e 46 4f 00 00 00 00 05 [LIGOGPSINFO.....]
|
1761
1761
|
# 0020: 0a 00 00 00 23 23 23 23 6a 00 00 00 c0 20 20 20 [....####j.... ]
|
1762
1762
|
# 0030: 20 f0 12 10 12 22 e1 0e 10 12 2f 90 10 13 02 f2 [ ...."..../.....]
|
1763
|
-
#
|
1764
|
-
# 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 03 00 00 [..@.freeGPS ....]
|
1765
|
-
# 0010: 4c 49 47 4f 47 50 53 49 4e 46 4f 00 00 00 00 05 [LIGOGPSINFO.....]
|
1766
|
-
# 0020: 00 00 00 00 23 23 23 23 69 00 00 00 c0 20 20 20 [....####i.... ]
|
1767
|
-
# 0030: 20 f0 12 10 12 23 e5 0e 10 12 2f 99 10 11 02 f2 [ ....#..../.....]
|
1768
|
-
# XGODY 12" 4K Dashcam
|
1763
|
+
# XGODY 12" 4K Dashcam - offset 16, encrypted and fuzzed with scale 1
|
1769
1764
|
# 0000: 00 00 00 a8 66 72 65 65 47 50 53 20 98 00 00 00 [....freeGPS ....]
|
1770
1765
|
# 0010: 4c 49 47 4f 47 50 53 49 4e 46 4f 00 00 00 00 05 [LIGOGPSINFO.....]
|
1771
1766
|
# 0020: cd 61 00 00 23 23 23 23 6d 00 00 00 c1 ec 41 20 [.a..####m.....A ]
|
1772
1767
|
# 0030: 20 f0 12 10 12 24 e5 0e 10 11 2f 92 10 12 00 f6 [ ....$..../.....]
|
1773
|
-
#
|
1768
|
+
# ABASK A8 4K Dashcam - offset 16, encrypted and fuzzed with scale 3
|
1769
|
+
# 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 03 00 00 [..@.freeGPS ....]
|
1770
|
+
# 0010: 4c 49 47 4f 47 50 53 49 4e 46 4f 00 00 00 00 05 [LIGOGPSINFO.....]
|
1771
|
+
# 0020: 00 00 00 00 23 23 23 23 69 00 00 00 c0 20 20 20 [....####i.... ]
|
1772
|
+
# 0030: 20 f0 12 10 12 23 e5 0e 10 12 2f 99 10 11 02 f2 [ ....#..../.....]
|
1773
|
+
# Unknown dashcam (forum16060) - offset 16, enciphered and fuzzed with scale 1
|
1774
|
+
# 0000: 00 00 40 00 66 72 65 65 47 50 53 20 98 00 00 00 [..@.freeGPS ....]
|
1775
|
+
# 0010: 4c 49 47 4f 47 50 53 49 4e 46 4f 00 00 00 00 0d [LIGOGPSINFO.....]
|
1776
|
+
# 0020: 0a 00 00 00 23 23 23 23 3b 00 a0 34 46 44 46 31 [....####;..4FDF1]
|
1777
|
+
# 0030: 2f 44 39 2f 45 38 20 44 3d 4c 47 4a 4c 39 38 20 [/D9/E8 D=LGJL98 ]
|
1778
|
+
# Rexing dashcam V1GW-4K - offset 48, encrypted and fuzzed with scale 1
|
1774
1779
|
# 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 03 00 00 [..@.freeGPS ....]
|
1775
1780
|
# 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
1776
1781
|
# 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
1777
1782
|
# 0030: 4c 49 47 4f 47 50 53 49 4e 46 4f 00 00 00 00 05 [LIGOGPSINFO.....]
|
1778
1783
|
# 0040: 01 00 00 00 23 23 23 23 73 00 00 00 c0 20 20 20 [....####s.... ]
|
1779
1784
|
# 0050: 20 f0 12 10 12 23 e5 0e 10 12 2f 95 10 12 01 f3 [ ....#..../.....]
|
1780
|
-
#
|
1781
|
-
# 0070: 13 22 b3 16 10 01 fb 76 18 10 24 fa 0e 11 10 22 [.".....v..$...."]
|
1782
|
-
# Kingslim D4 dashcam
|
1785
|
+
# Kingslim D4 dashcam - offset 80, encrypted and fuzzed with scale 1
|
1783
1786
|
# 0000: 0a 00 00 00 0b 00 00 00 07 00 00 00 e5 07 00 00 [................]
|
1784
1787
|
# 0010: 06 00 00 00 03 00 00 00 41 4e 57 31 91 52 83 45 [........ANW1.R.E]
|
1785
1788
|
# 0020: 15 70 fe c5 29 5c c3 41 ae c7 af 42 00 00 d1 be [.p..)\.A...B....]
|
@@ -1792,7 +1795,7 @@ sub ProcessFreeGPS($$$)
|
|
1792
1795
|
# (this is weak, but the only difference I could find between these 2 headers)
|
1793
1796
|
# (NOTE: ../testpics/gps_video/forum16229.mp4 uses this word for a counter!)
|
1794
1797
|
$$et{LigoGPSScale} = 3 if $pos == 16 and $$dataPt =~ /^.{12}\xf0\x03\0\0.{16}\0{4}/s;
|
1795
|
-
ProcessLigoGPS($et, \%dirInfo, $tagTbl);
|
1798
|
+
Image::ExifTool::LigoGPS::ProcessLigoGPS($et, \%dirInfo, $tagTbl);
|
1796
1799
|
$done = 1;
|
1797
1800
|
|
1798
1801
|
# also... when offset is 0x50 (Kingslim), the GPS also exists in this format:
|
@@ -2735,291 +2738,6 @@ sub Process_nbmt($$$)
|
|
2735
2738
|
return 1;
|
2736
2739
|
}
|
2737
2740
|
|
2738
|
-
#------------------------------------------------------------------------------
|
2739
|
-
# Un-do LIGOGPS fuzzing
|
2740
|
-
# Inputs: 0) fuzzed latitude, 1) fuzzed longitude, 2) scale factor
|
2741
|
-
# Returns: 0) latitude, 1) longitude
|
2742
|
-
sub UnfuzzLigoGPS($$$)
|
2743
|
-
{
|
2744
|
-
my ($lat, $lon, $scl) = @_;
|
2745
|
-
my $lat2 = int($lat / 10) * 10;
|
2746
|
-
my $lon2 = int($lon / 10) * 10;
|
2747
|
-
return($lat2 + ($lon - $lon2) * $scl, $lon2 + ($lat - $lat2) * $scl);
|
2748
|
-
}
|
2749
|
-
|
2750
|
-
#------------------------------------------------------------------------------
|
2751
|
-
# Decrypt LIGOGPSINFO record (starting with "####")
|
2752
|
-
# Inputs: 0) encrypted GPS record incuding 8-byte header
|
2753
|
-
# Returns: decrypted record including 4-byte uint32 header, or undef on error
|
2754
|
-
sub DecryptLigoGPS($)
|
2755
|
-
{
|
2756
|
-
my $str = shift;
|
2757
|
-
my $num = unpack('x4V',$str);
|
2758
|
-
return undef if $num < 4;
|
2759
|
-
$num = 0x84 if $num > 0x84; # (be safe)
|
2760
|
-
my @in = unpack("x8C$num",$str);
|
2761
|
-
my @out;
|
2762
|
-
while (@in) {
|
2763
|
-
my $b = shift @in;
|
2764
|
-
my $steeringBits = $b & 0xe0;
|
2765
|
-
if ($steeringBits >= 0xc0) {
|
2766
|
-
return undef if @in < 4;
|
2767
|
-
push @out, (shift(@in) | $b & 0x01) ^ 0x20,
|
2768
|
-
(shift(@in) | $b & 0x02) ^ 0x20,
|
2769
|
-
(shift(@in) | $b & 0x0c) ^ 0x20,
|
2770
|
-
shift(@in) ^ 0x20 | $b & 0x30;
|
2771
|
-
} elsif ($steeringBits >= 0x40) {
|
2772
|
-
return undef if @in < 3;
|
2773
|
-
if ($steeringBits == 0x40) {
|
2774
|
-
push @out, 0x20,
|
2775
|
-
(shift(@in) | $b & 0x01) ^ 0x20,
|
2776
|
-
(shift(@in) | $b & 0x06) ^ 0x20,
|
2777
|
-
(shift(@in) | $b & 0x18) ^ 0x20;
|
2778
|
-
} elsif ($steeringBits == 0x60) {
|
2779
|
-
push @out, (shift(@in) | $b & 0x03) ^ 0x20,
|
2780
|
-
0x20,
|
2781
|
-
(shift(@in) | $b & 0x04) ^ 0x20,
|
2782
|
-
(shift(@in) | $b & 0x18) ^ 0x20;
|
2783
|
-
} elsif ($steeringBits == 0x80) {
|
2784
|
-
push @out, (shift(@in) | $b & 0x03) ^ 0x20,
|
2785
|
-
(shift(@in) | $b & 0x0c) ^ 0x20,
|
2786
|
-
0x20,
|
2787
|
-
(shift(@in) | $b & 0x10) ^ 0x20;
|
2788
|
-
} else {
|
2789
|
-
push @out, (shift(@in) | $b & 0x01) ^ 0x20,
|
2790
|
-
(shift(@in) | $b & 0x06) ^ 0x20,
|
2791
|
-
(shift(@in) | $b & 0x18) ^ 0x20,
|
2792
|
-
0x20;
|
2793
|
-
}
|
2794
|
-
} elsif ($steeringBits == 0x00) {
|
2795
|
-
return undef if @in < 1;
|
2796
|
-
push @out, shift(@in) | $b & 0x13;
|
2797
|
-
} else {
|
2798
|
-
return undef; # (shouldn't happen)
|
2799
|
-
}
|
2800
|
-
}
|
2801
|
-
return pack 'C*', @out;
|
2802
|
-
}
|
2803
|
-
|
2804
|
-
#------------------------------------------------------------------------------
|
2805
|
-
# Decipher and parse LIGOGPSINFO record (starting with "####")
|
2806
|
-
# Inputs: 0) ExifTool ref, 1) enciphered string, 2) tag table ref
|
2807
|
-
# Returns: true if this looked like an enciphered string
|
2808
|
-
# Notes: handles contained tags, but may defer handling until full cipher is known
|
2809
|
-
sub DecipherLigoGPS($$$)
|
2810
|
-
{
|
2811
|
-
my ($et, $str, $tagTbl) = @_;
|
2812
|
-
|
2813
|
-
# (enciphered characters must be in the range 0x30-0x5f ('0' - '_'))
|
2814
|
-
$str =~ m[^####.{4}([0-_])[0-_]{3}/[0-_]{2}/[0-_]{2} ..([0-_])..([0-_]).([0-_]) ]s or return undef;
|
2815
|
-
return undef unless $2 eq $3; # (colons in time string must be the same)
|
2816
|
-
|
2817
|
-
my $cipherInfo = $$et{LigoCipher};
|
2818
|
-
$cipherInfo or $cipherInfo = $$et{LigoCipher} = { cache => [ ], secs => [ ], two => -1 };
|
2819
|
-
my $decipher = $$cipherInfo{decipher};
|
2820
|
-
my $cache = $$cipherInfo{cache};
|
2821
|
-
|
2822
|
-
# determine the cipher code table based on the advancing 1's digit of seconds
|
2823
|
-
unless ($decipher) {
|
2824
|
-
push @$cache, $str; # cache records until we can decipher them
|
2825
|
-
my ($millennium, $colon) = ($1, $2);
|
2826
|
-
# determine the Caesar cipher lookup table
|
2827
|
-
# (only characters in range 0x30-0x5f are encrypted)
|
2828
|
-
my $secs = $$cipherInfo{secs};
|
2829
|
-
push @$secs, $4 unless @$secs and $${secs}[-1] eq $4;
|
2830
|
-
$$cipherInfo{two} = $#$secs if $4 eq $millennium; # save index of enciphered '2'
|
2831
|
-
return 1 if @$secs < 10; # must cache the data until we know all 10 digits
|
2832
|
-
my $two = $$cipherInfo{two}; # (index of '2' in the array)
|
2833
|
-
my %decipher = ( $colon => ':' ); # (':' is the time separator)
|
2834
|
-
foreach (0..9) {
|
2835
|
-
my $ch = $$secs[($_ + $two - 2 + 10) % 10];
|
2836
|
-
if ($two < 0 or defined $decipher{$ch}) { # (must be a unique code for each digit)
|
2837
|
-
@$cipherInfo{'secs','two'} = ([ ], -1); # reset and try again
|
2838
|
-
$et->Warn('Hiccup while deciphering LIGOGPSINFO');
|
2839
|
-
return 1;
|
2840
|
-
}
|
2841
|
-
$decipher{$ch} = chr($_ + 0x30);
|
2842
|
-
}
|
2843
|
-
# also know the lat/lon quadrant from the signs of the coordinates
|
2844
|
-
if ($str =~ / ([0-_])$colon(-?).*? ([0-_])$colon(-?)/) {
|
2845
|
-
@decipher{$1,$3} = ($2 ? 'S' : 'N', $4 ? 'W' : 'E');
|
2846
|
-
}
|
2847
|
-
# fill in unknown entries with '?' (only chars 0x30-0x5f are enciphered)
|
2848
|
-
defined $decipher{$_} or $decipher{$_} = '?' foreach map(chr, 0x30..0x5f);
|
2849
|
-
$decipher = $$cipherInfo{decipher} = \%decipher;
|
2850
|
-
$str = shift @$cache; # start deciphering at oldest cache entry
|
2851
|
-
}
|
2852
|
-
|
2853
|
-
# apply reverse Caesar cipher and extract GPS information
|
2854
|
-
do {
|
2855
|
-
my $pre = substr($str, 4, 4); # save second 4 bytes of header
|
2856
|
-
($str = substr($str,8)) =~ s/\0+$//; # remove 8-byte header and null padding
|
2857
|
-
$str =~ s/([0-_])/$$decipher{$1}/g; # decipher
|
2858
|
-
if ($$et{OPTIONS}{Verbose} > 1) {
|
2859
|
-
$et->VPrint(1, "$$et{INDENT}\(Deciphered: ".unpack('H8',$pre)." $str)\n");
|
2860
|
-
}
|
2861
|
-
# add back leading 4 bytes (int16u counter plus 2 unknown bytes), and parse
|
2862
|
-
# (not fuzzed in my only sample when found in standard 'skip' atom)
|
2863
|
-
ParseLigoGPS($et, "$pre$str", $tagTbl, $$et{LigoType} eq 'LigoGPSInfo');
|
2864
|
-
} while $str = shift @$cache;
|
2865
|
-
|
2866
|
-
return 1;
|
2867
|
-
}
|
2868
|
-
|
2869
|
-
#------------------------------------------------------------------------------
|
2870
|
-
# Parse decrypted/deciphered (but not defuzzed) LIGOGPSINFO record
|
2871
|
-
# (record starts with 4-byte int32u counter followed by date/time, etc)
|
2872
|
-
# Inputs: 0) ExifTool ref, 1) GPS string, 2) tag table ref, 3) not fuzzed
|
2873
|
-
# Returns: nothing
|
2874
|
-
sub ParseLigoGPS($$$;$)
|
2875
|
-
{
|
2876
|
-
my ($et, $str, $tagTbl, $noFuzz) = @_;
|
2877
|
-
|
2878
|
-
# example string input
|
2879
|
-
# "....2022/09/19 12:45:24 N:31.285065 W:124.759483 46.93 km/h x:-0.000 y:-0.000 z:-0.000"
|
2880
|
-
unless ($str=~ /^.{4}(\S+ \S+)\s+([NS?]):(-?)([.\d]+)\s+([EW?]):(-?)([\.\d]+)\s+([.\d]+)/s) {
|
2881
|
-
$et->Warn('LIGOGPSINFO format error');
|
2882
|
-
return;
|
2883
|
-
}
|
2884
|
-
my ($time,$latRef,$latNeg,$lat,$lonRef,$lonNeg,$lon,$spd) = ($1,$2,$3,$4,$5,$6,$7,$8);
|
2885
|
-
my %gpsScl = ( 1 => 1.524855137, 2 => 1.456027985, 3 => 1.15368 );
|
2886
|
-
my $spdScl = $noFuzz ? $knotsToKph : 1.85407333;
|
2887
|
-
$$et{DOC_NUM} = ++$$et{DOC_COUNT};
|
2888
|
-
$time =~ tr(/)(:);
|
2889
|
-
# convert from DDMM.MMMMMM to DD.DDDDDD if necessary
|
2890
|
-
# (speed wasn't scaled in my 1 sample with this format)
|
2891
|
-
$lat =~ /^\d{3}/ and ConvertLatLon($lat,$lon), $spdScl = 1;
|
2892
|
-
unless ($noFuzz) { # unfuzz the coordinates if necessary
|
2893
|
-
my $scl = $$et{OPTIONS}{LigoGPSScale} || $$et{LigoGPSScale} || 1;
|
2894
|
-
$scl = $gpsScl{$scl} if $gpsScl{$scl};
|
2895
|
-
($lat, $lon) = UnfuzzLigoGPS($lat, $lon, $scl);
|
2896
|
-
}
|
2897
|
-
# a final sanity check
|
2898
|
-
($lat > 90 or $lon > 180) and $et->Warn('LIGOGPSINFO coordinates out of range'), return;
|
2899
|
-
$$et{SET_GROUP1} = 'LIGO';
|
2900
|
-
$et->HandleTag($tagTbl, 'GPSDateTime', $time);
|
2901
|
-
# (ignore N/S/E/W if coordinate is signed)
|
2902
|
-
$et->HandleTag($tagTbl, 'GPSLatitude', $lat * (($latNeg or $latRef eq 'S') ? -1 : 1));
|
2903
|
-
$et->HandleTag($tagTbl, 'GPSLongitude', $lon * (($lonNeg or $lonRef eq 'W') ? -1 : 1));
|
2904
|
-
$et->HandleTag($tagTbl, 'GPSSpeed', $spd * $spdScl);
|
2905
|
-
$et->HandleTag($tagTbl, 'GPSTrack', $1) if $str =~ /\bA:(\S+)/;
|
2906
|
-
# (have a sample where tab is used to separate acc components)
|
2907
|
-
$et->HandleTag($tagTbl, 'Accelerometer',"$1 $2 $3") if $str =~ /x:(\S+)\sy:(\S+)\sz:(\S+)/;
|
2908
|
-
$et->HandleTag($tagTbl, 'M', $1) if $str =~ /\bM:(\S+)/;
|
2909
|
-
$et->HandleTag($tagTbl, 'H', $1) if $str =~ /\bH:(\S+)/;
|
2910
|
-
delete $$et{SET_GROUP1};
|
2911
|
-
}
|
2912
|
-
|
2913
|
-
#------------------------------------------------------------------------------
|
2914
|
-
# Process LIGOGPSINFO data (non-JSON format)
|
2915
|
-
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
|
2916
|
-
# 3) 1=LIGOGPS lat/lon/spd weren't fuzzed
|
2917
|
-
# Returns: 1 on success
|
2918
|
-
sub ProcessLigoGPS($$$;$)
|
2919
|
-
{
|
2920
|
-
my ($et, $dirInfo, $tagTbl, $noFuzz) = @_;
|
2921
|
-
my $dataPt = $$dirInfo{DataPt};
|
2922
|
-
my $pos = ($$dirInfo{DirStart} || 0) + 0x14;
|
2923
|
-
my $cipherInfo = $$et{LigoCipher};
|
2924
|
-
return undef if $pos > length $$dataPt;
|
2925
|
-
$$et{LigoType} = $$dirInfo{DirName} || 'LigoGPS';
|
2926
|
-
push @{$$et{PATH}}, $$et{LigoType} unless $$dirInfo{DirID};
|
2927
|
-
# not fuzzed if header is "LIGOGPSINFO\0\0\0\0\x01" (BlueSkySeaDV688)
|
2928
|
-
$noFuzz = 1 if substr($$dataPt, $pos-8, 4) eq "\0\0\0\x01";
|
2929
|
-
$et->VerboseDir($$et{LigoType});
|
2930
|
-
for (; $pos + 0x84 <= length($$dataPt); $pos+=0x84) {
|
2931
|
-
my $dat = substr($$dataPt, $pos, 0x84);
|
2932
|
-
$dat =~ /^####/ or next; # (have seen blank records filled with zeros, so keep trying)
|
2933
|
-
# decipher if we already know the encryption
|
2934
|
-
$cipherInfo and $$cipherInfo{decipher} and DecipherLigoGPS($et, $dat, $tagTbl) and next;
|
2935
|
-
my $str = DecryptLigoGPS($dat);
|
2936
|
-
defined $str or DecipherLigoGPS($et, $dat, $tagTbl), next; # try to decipher
|
2937
|
-
$et->VPrint(1, "$$et{INDENT}\(Decrypted: ",unpack('V',$str),' ',substr($str,4),")\n") if $$et{OPTIONS}{Verbose} > 1;
|
2938
|
-
ParseLigoGPS($et, $str, $tagTbl, $noFuzz);
|
2939
|
-
}
|
2940
|
-
pop @{$$et{PATH}} unless $$dirInfo{DirID};
|
2941
|
-
delete $$et{DOC_NUM};
|
2942
|
-
return 1;
|
2943
|
-
}
|
2944
|
-
|
2945
|
-
#------------------------------------------------------------------------------
|
2946
|
-
# Process LIGOGPSINFO JSON-format GPS (Yada RoadCam Pro 4K BT58189)
|
2947
|
-
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
2948
|
-
# Returns: 1 on success
|
2949
|
-
# Sample data (chained 512-byte records starting like this):
|
2950
|
-
# 0000: 4c 49 47 4f 47 50 53 49 4e 46 4f 20 7b 22 48 6f [LIGOGPSINFO {"Ho]
|
2951
|
-
# 0010: 75 72 22 3a 20 22 32 33 22 2c 20 22 4d 69 6e 75 [ur": "23", "Minu]
|
2952
|
-
# 0020: 74 65 22 3a 20 22 31 30 22 2c 20 22 53 65 63 6f [te": "10", "Seco]
|
2953
|
-
# 0030: 6e 64 22 3a 20 22 32 32 22 2c 20 22 59 65 61 72 [nd": "22", "Year]
|
2954
|
-
# 0040: 22 3a 20 22 32 30 32 33 22 2c 20 22 4d 6f 6e 74 [": "2023", "Mont]
|
2955
|
-
# 0050: 68 22 3a 20 22 31 32 22 2c 20 22 44 61 79 22 3a [h": "12", "Day":]
|
2956
|
-
# 0060: 20 22 32 38 22 2c 20 22 73 74 61 74 75 73 22 3a [ "28", "status":]
|
2957
|
-
sub ProcessLigoJSON($$$)
|
2958
|
-
{
|
2959
|
-
my ($et, $dirInfo, $tagTbl) = @_;
|
2960
|
-
my $dataPt = $$dirInfo{DataPt};
|
2961
|
-
my $dirLen = $$dirInfo{DirLen};
|
2962
|
-
require Image::ExifTool::Import;
|
2963
|
-
$et->VerboseDir('LIGO_JSON', undef, length($$dataPt));
|
2964
|
-
$$et{SET_GROUP1} = 'LIGO';
|
2965
|
-
while ($$dataPt =~ /LIGOGPSINFO (\{.*?\})/g) {
|
2966
|
-
my $json = $1;
|
2967
|
-
my %dbase;
|
2968
|
-
Image::ExifTool::Import::ReadJSON(\$json, \%dbase);
|
2969
|
-
my $info = $dbase{'*'} or next;
|
2970
|
-
# my sample contains the following JSON fields (in this order):
|
2971
|
-
# Hour Minute Second Year Month Day (GPS UTC time)
|
2972
|
-
# status NS EW Latitude Longitude Speed (speed in knots)
|
2973
|
-
# GsensorX GsensorY GsensorZ (units? - only seen "000" for all)
|
2974
|
-
# MHour MMinute MSecond MYear MMonth MDay (local dashcam clock time)
|
2975
|
-
# OLatitude OLongitude (? same values as Latitude/Longitude)
|
2976
|
-
next unless defined $$info{status} and $$info{status} eq 'A'; # only read if GPS is active
|
2977
|
-
$$et{DOC_NUM} = ++$$et{DOC_COUNT};
|
2978
|
-
my $num = 0;
|
2979
|
-
defined $$info{$_} and ++$num foreach qw(Year Month Day Hour Minute Second);
|
2980
|
-
if ($num == 6) {
|
2981
|
-
# this is the GPS time in UTC
|
2982
|
-
my $time = sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2dZ',@$info{qw{Year Month Day Hour Minute Second}});
|
2983
|
-
$et->HandleTag($tagTbl, GPSDateTime => $time);
|
2984
|
-
}
|
2985
|
-
if ($$info{Latitude} and $$info{Longitude}) {
|
2986
|
-
my $lat = $$info{Latitude};
|
2987
|
-
$lat = -$lat if $$info{NS} and $$info{NS} eq 'S';
|
2988
|
-
my $lon = $$info{Longitude};
|
2989
|
-
$lon = -$lon if $$info{EW} and $$info{EW} eq 'W';
|
2990
|
-
$et->HandleTag($tagTbl, GPSLatitude => $lat);
|
2991
|
-
$et->HandleTag($tagTbl, GPSLongitude => $lon);
|
2992
|
-
}
|
2993
|
-
$et->HandleTag($tagTbl, GPSSpeed => $$info{Speed} * $knotsToKph) if defined $$info{Speed};
|
2994
|
-
if (defined $$info{GsensorX} and defined $$info{GsensorY} and defined $$info{GsensorZ}) {
|
2995
|
-
# (don't know conversion factor for accel data, so leave it raw for now)
|
2996
|
-
$et->HandleTag($tagTbl, Accelerometer => "$$info{GsensorX} $$info{GsensorY} $$info{GsensorZ}");
|
2997
|
-
}
|
2998
|
-
$num = 0;
|
2999
|
-
defined $$info{$_} and ++$num foreach qw(MYear MMonth MDay MHour MMinute MSecond);
|
3000
|
-
if ($num == 6) {
|
3001
|
-
# this is the dashcam clock time (local time zone)
|
3002
|
-
my $time = sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d',@$info{qw{MYear MMonth MDay MHour MMinute MSecond}});
|
3003
|
-
$et->HandleTag($tagTbl, DateTimeOriginal => $time);
|
3004
|
-
}
|
3005
|
-
if (defined $$info{OLatitude} and defined $$info{OLongitude}) {
|
3006
|
-
my $lat = $$info{OLatitude};
|
3007
|
-
$lat = -$lat if $$info{NS} and $$info{NS} eq 'S';
|
3008
|
-
my $lon = $$info{OLongitude};
|
3009
|
-
$lon = -$lon if $$info{EW} and $$info{EW} eq 'W';
|
3010
|
-
$et->HandleTag($tagTbl, GPSLatitude2 => $lat);
|
3011
|
-
$et->HandleTag($tagTbl, GPSLongitude2 => $lon);
|
3012
|
-
}
|
3013
|
-
unless ($et->Options('ExtractEmbedded')) {
|
3014
|
-
$et->Warn('Use the ExtractEmbedded option to extract all timed GPS',3);
|
3015
|
-
last;
|
3016
|
-
}
|
3017
|
-
}
|
3018
|
-
delete $$et{DOC_NUM};
|
3019
|
-
delete $$et{SET_GROUP1};
|
3020
|
-
return 1;
|
3021
|
-
}
|
3022
|
-
|
3023
2741
|
#------------------------------------------------------------------------------
|
3024
2742
|
# Process Kenwood drv-a301w dashcam 'udta' atom (ref PH)
|
3025
2743
|
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
@@ -3912,7 +3630,7 @@ information like GPS tracks from MOV, MP4 and INSV media data.
|
|
3912
3630
|
|
3913
3631
|
=head1 AUTHOR
|
3914
3632
|
|
3915
|
-
Copyright 2003-
|
3633
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
3916
3634
|
|
3917
3635
|
This library is free software; you can redistribute it and/or modify it
|
3918
3636
|
under the same terms as Perl itself.
|
@@ -443,6 +443,10 @@ numerical, and generated automatically otherwise.
|
|
443
443
|
list-type tag (unless it is a list of lang-alt lists, which is
|
444
444
|
uncommon).
|
445
445
|
|
446
|
+
'IsList' - Flag to mark tag as List-type in the documentation
|
447
|
+
without accumulating entries from subsequent tags. Used when
|
448
|
+
the value for a single tag is a complete list.
|
449
|
+
|
446
450
|
'MakerNotes' - set if this tag is maker note data.
|
447
451
|
|
448
452
|
'MakerPreview' - set in the PreviewImageStart tag information
|
@@ -2214,7 +2214,7 @@ including AVI videos, WAV audio files and WEBP images.
|
|
2214
2214
|
|
2215
2215
|
=head1 AUTHOR
|
2216
2216
|
|
2217
|
-
Copyright 2003-
|
2217
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
2218
2218
|
|
2219
2219
|
This library is free software; you can redistribute it and/or modify it
|
2220
2220
|
under the same terms as Perl itself.
|
@@ -225,7 +225,7 @@ resource files.
|
|
225
225
|
|
226
226
|
=head1 AUTHOR
|
227
227
|
|
228
|
-
Copyright 2003-
|
228
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
229
229
|
|
230
230
|
This library is free software; you can redistribute it and/or modify it
|
231
231
|
under the same terms as Perl itself.
|
@@ -366,7 +366,7 @@ information from RTF (Rich Text Format) documents.
|
|
366
366
|
|
367
367
|
=head1 AUTHOR
|
368
368
|
|
369
|
-
Copyright 2003-
|
369
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
370
370
|
|
371
371
|
This library is free software; you can redistribute it and/or modify it
|
372
372
|
under the same terms as Perl itself.
|
@@ -125,7 +125,7 @@ images are a type of high dynamic-range image.
|
|
125
125
|
|
126
126
|
=head1 AUTHOR
|
127
127
|
|
128
|
-
Copyright 2003-
|
128
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
129
129
|
|
130
130
|
This library is free software; you can redistribute it and/or modify it
|
131
131
|
under the same terms as Perl itself.
|
@@ -168,7 +168,7 @@ information from Rawzor compressed images.
|
|
168
168
|
|
169
169
|
=head1 AUTHOR
|
170
170
|
|
171
|
-
Copyright 2003-
|
171
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
172
172
|
|
173
173
|
This library is free software; you can redistribute it and/or modify it
|
174
174
|
under the same terms as Perl itself.
|
@@ -715,7 +715,7 @@ little-endian, but the Real format is big-endian.
|
|
715
715
|
|
716
716
|
=head1 AUTHOR
|
717
717
|
|
718
|
-
Copyright 2003-
|
718
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
719
719
|
|
720
720
|
This library is free software; you can redistribute it and/or modify it
|
721
721
|
under the same terms as Perl itself.
|
@@ -431,7 +431,7 @@ maker notes in images from Reconyx cameras.
|
|
431
431
|
|
432
432
|
=head1 AUTHOR
|
433
433
|
|
434
|
-
Copyright 2003-
|
434
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
435
435
|
|
436
436
|
This library is free software; you can redistribute it and/or modify it
|
437
437
|
under the same terms as Perl itself.
|
@@ -303,7 +303,7 @@ from Redcode R3D version 1 and 2 video files.
|
|
303
303
|
|
304
304
|
=head1 AUTHOR
|
305
305
|
|
306
|
-
Copyright 2003-
|
306
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
307
307
|
|
308
308
|
This library is free software; you can redistribute it and/or modify it
|
309
309
|
under the same terms as Perl itself.
|
@@ -1252,7 +1252,7 @@ interpret Ricoh maker notes EXIF meta information.
|
|
1252
1252
|
|
1253
1253
|
=head1 AUTHOR
|
1254
1254
|
|
1255
|
-
Copyright 2003-
|
1255
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
1256
1256
|
|
1257
1257
|
This library is free software; you can redistribute it and/or modify it
|
1258
1258
|
under the same terms as Perl itself.
|
@@ -1762,7 +1762,7 @@ Samsung maker notes in EXIF information.
|
|
1762
1762
|
|
1763
1763
|
=head1 AUTHOR
|
1764
1764
|
|
1765
|
-
Copyright 2003-
|
1765
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
1766
1766
|
|
1767
1767
|
This library is free software; you can redistribute it and/or modify it
|
1768
1768
|
under the same terms as Perl itself.
|
@@ -419,7 +419,7 @@ Sanyo maker notes in EXIF information.
|
|
419
419
|
|
420
420
|
=head1 AUTHOR
|
421
421
|
|
422
|
-
Copyright 2003-
|
422
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
423
423
|
|
424
424
|
This library is free software; you can redistribute it and/or modify it
|
425
425
|
under the same terms as Perl itself.
|
@@ -128,7 +128,7 @@ metadata from the JPEG APP4 SCALADO segment.
|
|
128
128
|
|
129
129
|
=head1 AUTHOR
|
130
130
|
|
131
|
-
Copyright 2003-
|
131
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
132
132
|
|
133
133
|
This library is free software; you can redistribute it and/or modify it
|
134
134
|
under the same terms as Perl itself.
|
@@ -631,7 +631,7 @@ limited to the range 1970 to 2038 on 32-bit systems.
|
|
631
631
|
|
632
632
|
=head1 AUTHOR
|
633
633
|
|
634
|
-
Copyright 2003-
|
634
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
635
635
|
|
636
636
|
This library is free software; you can redistribute it and/or modify it
|
637
637
|
under the same terms as Perl itself.
|
@@ -344,7 +344,7 @@ name prefix.
|
|
344
344
|
|
345
345
|
=head1 AUTHOR
|
346
346
|
|
347
|
-
Copyright 2003-
|
347
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
348
348
|
|
349
349
|
This library is free software; you can redistribute it and/or modify it
|
350
350
|
under the same terms as Perl itself.
|
@@ -864,7 +864,7 @@ Sigma and Foveon maker notes in EXIF information.
|
|
864
864
|
|
865
865
|
=head1 AUTHOR
|
866
866
|
|
867
|
-
Copyright 2003-
|
867
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
868
868
|
|
869
869
|
This library is free software; you can redistribute it and/or modify it
|
870
870
|
under the same terms as Perl itself.
|
@@ -680,7 +680,7 @@ Sigma and Foveon X3F images.
|
|
680
680
|
|
681
681
|
=head1 AUTHOR
|
682
682
|
|
683
|
-
Copyright 2003-
|
683
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
684
684
|
|
685
685
|
This library is free software; you can redistribute it and/or modify it
|
686
686
|
under the same terms as Perl itself.
|
@@ -11759,7 +11759,7 @@ Minolta.
|
|
11759
11759
|
|
11760
11760
|
=head1 AUTHOR
|
11761
11761
|
|
11762
|
-
Copyright 2003-
|
11762
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
11763
11763
|
|
11764
11764
|
This library is free software; you can redistribute it and/or modify it
|
11765
11765
|
under the same terms as Perl itself.
|
@@ -379,7 +379,7 @@ write Sony Image Data Converter version 3.0 metadata in ARW images.
|
|
379
379
|
|
380
380
|
=head1 AUTHOR
|
381
381
|
|
382
|
-
Copyright 2003-
|
382
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
383
383
|
|
384
384
|
This library is free software; you can redistribute it and/or modify it
|
385
385
|
under the same terms as Perl itself.
|
@@ -174,7 +174,7 @@ information.
|
|
174
174
|
|
175
175
|
=head1 AUTHOR
|
176
176
|
|
177
|
-
Copyright 2003-
|
177
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
178
178
|
|
179
179
|
This library is free software; you can redistribute it and/or modify it
|
180
180
|
under the same terms as Perl itself.
|
@@ -651,7 +651,7 @@ and values.
|
|
651
651
|
|
652
652
|
~head1 AUTHOR
|
653
653
|
|
654
|
-
Copyright 2003-
|
654
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
655
655
|
|
656
656
|
This library is free software; you can redistribute it and/or modify it
|
657
657
|
under the same terms as Perl itself.
|
@@ -835,7 +835,7 @@ Number of modules updated, or negative on error.
|
|
835
835
|
|
836
836
|
=head1 AUTHOR
|
837
837
|
|
838
|
-
Copyright 2003-
|
838
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
839
839
|
|
840
840
|
This library is free software; you can redistribute it and/or modify it
|
841
841
|
under the same terms as Perl itself.
|