diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Image/ExifTool.pm | 2 | ||||
-rw-r--r-- | lib/Image/ExifTool/Canon.pm | 11 | ||||
-rw-r--r-- | lib/Image/ExifTool/Exif.pm | 40 | ||||
-rw-r--r-- | lib/Image/ExifTool/Geotag.pm | 17 | ||||
-rw-r--r-- | lib/Image/ExifTool/MIE.pm | 8 | ||||
-rw-r--r-- | lib/Image/ExifTool/PDF.pm | 4 | ||||
-rw-r--r-- | lib/Image/ExifTool/Pentax.pm | 3 | ||||
-rw-r--r-- | lib/Image/ExifTool/PostScript.pm | 31 | ||||
-rw-r--r-- | lib/Image/ExifTool/QuickTime.pm | 4 | ||||
-rw-r--r-- | lib/Image/ExifTool/QuickTimeStream.pl | 35 | ||||
-rw-r--r-- | lib/Image/ExifTool/TagLookup.pm | 19 | ||||
-rw-r--r-- | lib/Image/ExifTool/TagNames.pod | 130 | ||||
-rw-r--r-- | lib/Image/ExifTool/ZIP.pm | 6 |
13 files changed, 210 insertions, 100 deletions
diff --git a/lib/Image/ExifTool.pm b/lib/Image/ExifTool.pm index 447ebdc9..05ecc919 100644 --- a/lib/Image/ExifTool.pm +++ b/lib/Image/ExifTool.pm @@ -27,7 +27,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes %mimeType $swapBytes $swapWords $currentByteOrder %unpackStd %jpegMarker %specialTags %fileTypeLookup); -$VERSION = '10.92'; +$VERSION = '10.93'; $RELEASE = ''; @ISA = qw(Exporter); %EXPORT_TAGS = ( diff --git a/lib/Image/ExifTool/Canon.pm b/lib/Image/ExifTool/Canon.pm index ea101e31..7dc72c5a 100644 --- a/lib/Image/ExifTool/Canon.pm +++ b/lib/Image/ExifTool/Canon.pm @@ -87,7 +87,7 @@ sub ProcessCTMD($$$); sub ProcessExifInfo($$$); sub SwapWords($); -$VERSION = '3.89'; +$VERSION = '3.90'; # Note: Removed 'USM' from 'L' lenses since it is redundant - PH # (or is it? Ref 32 shows 5 non-USM L-type lenses) @@ -822,6 +822,7 @@ my %canonQuality = ( 3 => 'Fine', 4 => 'RAW', 5 => 'Superfine', + 7 => 'CRAW', #42 130 => 'Normal Movie', #22 131 => 'Movie (2)', #PH (7DmkII 1920x1080) ); @@ -8350,7 +8351,11 @@ my %filterConv = ( Groups => { 2 => 'Preview' }, RawConv => 'substr($val, 16)', Binary => 1, - } + }, + CNOP => { #PH (M50) + Name => 'CanonCNOP', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CNOP' }, + }, ); %Image::ExifTool::Canon::UnknownIFD = ( @@ -8489,7 +8494,7 @@ my %filterConv = ( # Canon CNOP atoms (ref PH) %Image::ExifTool::Canon::CNOP = ( GROUPS => { 0 => 'MakerNotes', 1 => 'Canon', 2 => 'Video' }, - # CNFB - 52 bytes (7DmkII) + # CNFB - 52 bytes (7DmkII,M50) ); # 'skip' atom of Canon MOV videos (ref PH) diff --git a/lib/Image/ExifTool/Exif.pm b/lib/Image/ExifTool/Exif.pm index 04ac77ef..5b684c27 100644 --- a/lib/Image/ExifTool/Exif.pm +++ b/lib/Image/ExifTool/Exif.pm @@ -1395,7 +1395,18 @@ my %sampleFormat = ( }, # 0x7011 - int16u[4] (in SubIFD of Sony ARW images) - values: "0 4912 8212 12287","4000 7200 10050 12075" # 0x7020 - int32u[1] (in SubIFD of Sony ARW images) - values: 0,3 - # 0x7031 - int16u[1] (in SubIFD of Sony ARW images) - values: 256,257 + 0x7031 => { + Name => 'VignettingCorrection', + Notes => 'found in Sony ARW images', + Protected => 1, + Writable => 'int16s', + WriteGroup => 'SubIFD', + PrintConv => { + 256 => 'Off', + 257 => 'Auto', + 511 => 'No correction params available', + }, + }, 0x7032 => { Name => 'VignettingCorrParams', #forum7640 Notes => 'found in Sony ARW images', @@ -1404,7 +1415,18 @@ my %sampleFormat = ( WriteGroup => 'SubIFD', Count => 17, }, - # 0x7034 - int16u[1] (in SubIFD of Sony ARW images) - values: 1 + 0x7034 => { + Name => 'ChromaticAberrationCorrection', + Notes => 'found in Sony ARW images', + Protected => 1, + Writable => 'int16s', + WriteGroup => 'SubIFD', + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 255 => 'No correction params available', + }, + }, 0x7035 => { Name => 'ChromaticAberrationCorrParams', #forum6509 Notes => 'found in Sony ARW images', @@ -1413,7 +1435,19 @@ my %sampleFormat = ( WriteGroup => 'SubIFD', Count => 33, }, - # 0x7036 - int16u[1] (in SubIFD of Sony ARW images) - values: 0,1,17 + 0x7036 => { + Name => 'DistortionCorrection', + Notes => 'found in Sony ARW images', + Protected => 1, + Writable => 'int16s', + WriteGroup => 'SubIFD', + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 17 => 'Auto fixed by lens', + 255 => 'No correction params available', + }, + }, 0x7037 => { Name => 'DistortionCorrParams', #forum6509 Notes => 'found in Sony ARW images', diff --git a/lib/Image/ExifTool/Geotag.pm b/lib/Image/ExifTool/Geotag.pm index 7c69bcfd..5ca8b758 100644 --- a/lib/Image/ExifTool/Geotag.pm +++ b/lib/Image/ExifTool/Geotag.pm @@ -24,7 +24,7 @@ use strict; use vars qw($VERSION); use Image::ExifTool qw(:Public); -$VERSION = '1.54'; +$VERSION = '1.55'; sub JITTER() { return 2 } # maximum time jitter @@ -195,7 +195,7 @@ sub LoadTrackLog($$;$) $format = 'XML'; # check for NMEA sentence # (must ONLY start with ones that have timestamps! eg. not GSA or PTNTHPR!) - } elsif (/^\$(GP(RMC|GGA|GLL|ZDA)|PMGNTRK),/) { + } elsif (/^\$([A-Z]{2}(RMC|GGA|GLL|ZDA)|PMGNTRK),/) { $format = 'NMEA'; $nmeaStart = $2 || $1; # save type of first sentence } elsif (/^A(FLA|XSY|FIL)/) { @@ -370,7 +370,8 @@ DoneFix: $isDate = 1; my (%fix, $secs, $date, $nmea); if ($format eq 'NMEA') { # ignore unrecognized NMEA sentences - next unless /^\$(GP(RMC|GGA|GLL|GSA|ZDA)|PMGNTRK|PTNTHPR),/; + # (first 2 characters: GP=GPS, GL=GLONASS, GA=Gallileo, GN=combined, BD=Beidou) + next unless /^\$([A-Z]{2}(RMC|GGA|GLL|GSA|ZDA)|PMGNTRK|PTNTHPR),/; $nmea = $2 || $1; } # @@ -399,7 +400,7 @@ DoneFix: $isDate = 1; # $GPRMC,092204.999,A,4250.5589,S,14718.5084,E,0.00,89.68,211200,,*25 # $GPRMC,093657.007,,3652.835020,N,01053.104094,E,1.642,,290913,,,A*0F # $GPRMC,hhmmss.sss,A/V,ddmm.mmmm,N/S,ddmmm.mmmm,E/W,spd(knots),dir(deg),DDMMYY,,*cs - /^\$GPRMC,(\d{2})(\d{2})(\d+(\.\d*)?),A?,(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),(\d*\.?\d*),(\d*\.?\d*),(\d{2})(\d{2})(\d+)/ or next; + /^\$[A-Z]{2}RMC,(\d{2})(\d{2})(\d+(\.\d*)?),A?,(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),(\d*\.?\d*),(\d*\.?\d*),(\d{2})(\d{2})(\d+)/ or next; next if $13 > 31 or $14 > 12 or $15 > 99; # validate day/month/year $fix{lat} = (($5 || 0) + $6/60) * ($7 eq 'N' ? 1 : -1); $fix{lon} = (($8 || 0) + $9/60) * ($10 eq 'E' ? 1 : -1); @@ -415,7 +416,7 @@ DoneFix: $isDate = 1; # $GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,,,,0000*1F # $GPGGA,093657.000,3652.835020,N,01053.104094,E,,8,,166.924,M,40.9,M,,*77 # $GPGGA,hhmmss.sss,ddmm.mmmm,N/S,dddmm.mmmm,E/W,0=invalid,sats,hdop,alt,M,... - /^\$GPGGA,(\d{2})(\d{2})(\d+(\.\d*)?),(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),[1-6]?,(\d+)?,(\.\d+|\d+\.?\d*)?,(-?\d+\.?\d*)?,M?/ or next; + /^\$[A-Z]{2}GGA,(\d{2})(\d{2})(\d+(\.\d*)?),(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),[1-6]?,(\d+)?,(\.\d+|\d+\.?\d*)?,(-?\d+\.?\d*)?,M?/ or next; $fix{lat} = (($5 || 0) + $6/60) * ($7 eq 'N' ? 1 : -1); $fix{lon} = (($8 || 0) + $9/60) * ($10 eq 'E' ? 1 : -1); @fix{qw(nsats hdop alt)} = ($11,$12,$13); @@ -427,7 +428,7 @@ DoneFix: $isDate = 1; } elsif ($nmea eq 'GLL') { # $GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D # $GPGLL,ddmm.mmmm,N/S,dddmm.mmmm,E/W,hhmmss.sss,A/V*cs - /^\$GPGLL,(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),(\d{2})(\d{2})(\d+(\.\d*)?),A/ or next; + /^\$[A-Z]{2}GLL,(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),(\d{2})(\d{2})(\d+(\.\d*)?),A/ or next; $fix{lat} = (($1 || 0) + $2/60) * ($3 eq 'N' ? 1 : -1); $fix{lon} = (($4 || 0) + $5/60) * ($6 eq 'E' ? 1 : -1); $secs = (($7 * 60) + $8) * 60 + $9; @@ -436,7 +437,7 @@ DoneFix: $isDate = 1; # } elsif ($nmea eq 'GSA') { # $GPGSA,A,3,04,05,,,,,,,,,,,pdop,hdop,vdop*HH - /^\$GPGSA,[AM],([23]),((?:\d*,){11}(?:\d*)),(\d+\.?\d*|\.\d+)?,(\d+\.?\d*|\.\d+)?,(\d+\.?\d*|\.\d+)?\*/ or next; + /^\$[A-Z]{2}GSA,[AM],([23]),((?:\d*,){11}(?:\d*)),(\d+\.?\d*|\.\d+)?,(\d+\.?\d*|\.\d+)?,(\d+\.?\d*|\.\d+)?\*/ or next; @fix{qw(fixtype sats pdop hdop vdop)} = ($1.'d',$2,$3,$4,$5); # count the number of acquired satellites my @a = ($fix{sats} =~ /\d+/g); @@ -448,7 +449,7 @@ DoneFix: $isDate = 1; } elsif ($nmea eq 'ZDA') { # $GPZDA,093655.000,29,09,2013,,*58 # $GPZDA,hhmmss.ss,DD,MM,YYYY,tzh,tzm (hhmmss in UTC) - /^\$GPZDA,(\d{2})(\d{2})(\d{2}(\.\d*)?),(\d+),(\d+),(\d+)/ or next; + /^\$[A-Z]{2}ZDA,(\d{2})(\d{2})(\d{2}(\.\d*)?),(\d+),(\d+),(\d+)/ or next; $secs = (($1 * 60) + $2) * 60 + $3; $date = Time::Local::timegm(0,0,0,$5,$6-1,$7-1900); # diff --git a/lib/Image/ExifTool/MIE.pm b/lib/Image/ExifTool/MIE.pm index e6af0314..c6e72042 100644 --- a/lib/Image/ExifTool/MIE.pm +++ b/lib/Image/ExifTool/MIE.pm @@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils); use Image::ExifTool::Exif; use Image::ExifTool::GPS; -$VERSION = '1.46'; +$VERSION = '1.47'; sub ProcessMIE($$); sub ProcessMIEGroup($$$); @@ -152,6 +152,9 @@ my %offOn = ( 0 => 'Off', 1 => 'On' ); (eg. C<55(mi/h)>). If no units are specified, the default units are written. + 4) ExifTool writes compressed metadata to MIE files if the Compress (-z) + option is used and Compress::Zlib is available. + See L<http://owl.phy.queensu.ca/~phil/exiftool/MIE1.1-20070121.pdf> for the official MIE specification. }, @@ -1122,6 +1125,7 @@ sub WriteMIEGroup($$$) eval { require Compress::Zlib }) { $subdirInfo{Compact} = 1; + $subdirInfo{ReadOnly} = 1; # because XMP is not writable in place } } $subdirInfo{Parent} = $dirName; @@ -1603,7 +1607,7 @@ sub ProcessMIEGroup($$$) } $et->VerboseInfo($lastTag, $tagInfo, DataPt => \$value, - DataPos => $raf->Tell() - $valLen, + DataPos => $wasCompressed ? undef : $raf->Tell() - $valLen, Size => $valLen, Format => $formatStr, Value => $val, diff --git a/lib/Image/ExifTool/PDF.pm b/lib/Image/ExifTool/PDF.pm index 8cf57a2d..2dd97200 100644 --- a/lib/Image/ExifTool/PDF.pm +++ b/lib/Image/ExifTool/PDF.pm @@ -21,7 +21,7 @@ use vars qw($VERSION $AUTOLOAD $lastFetched); use Image::ExifTool qw(:DataAccess :Utils); require Exporter; -$VERSION = '1.45'; +$VERSION = '1.46'; sub FetchObject($$$$); sub ExtractObject($$;$$); @@ -2086,7 +2086,7 @@ sub ReadPDF($$) # (linearization dictionary must be in the first 1024 bytes of the file) $raf->Read($buff, 1024) >= 8 or return 0; $buff =~ /^(\s*)%PDF-(\d+\.\d+)/ or return 0; - $$et{PDFBase} = length $1; + $$et{PDFBase} = length $1 and $et->Warn('PDF header is not at start of file',1); $pdfVer = $2; $et->SetFileType(); # set the FileType tag $et->Warn("May not be able to read a PDF version $pdfVer file") if $pdfVer >= 2.0; diff --git a/lib/Image/ExifTool/Pentax.pm b/lib/Image/ExifTool/Pentax.pm index d3385976..52dd876f 100644 --- a/lib/Image/ExifTool/Pentax.pm +++ b/lib/Image/ExifTool/Pentax.pm @@ -58,7 +58,7 @@ use Image::ExifTool::Exif; use Image::ExifTool::GPS; use Image::ExifTool::HP; -$VERSION = '3.21'; +$VERSION = '3.22'; sub CryptShutterCount($$); sub PrintFilter($$$); @@ -947,6 +947,7 @@ my %binaryDataAttrs = ( 4 => 'RAW', #5 5 => 'Premium', #PH (K20D) 7 => 'RAW (pixel shift enabled)', #forum6536 (K-3 II) + 8 => 'Dynamic Pixel Shift', #IB 65535 => 'n/a', #PH (Q MOV video) }, }, diff --git a/lib/Image/ExifTool/PostScript.pm b/lib/Image/ExifTool/PostScript.pm index 13aa2a54..ea4ee5c2 100644 --- a/lib/Image/ExifTool/PostScript.pm +++ b/lib/Image/ExifTool/PostScript.pm @@ -16,7 +16,7 @@ use strict; use vars qw($VERSION $AUTOLOAD); use Image::ExifTool qw(:DataAccess :Utils); -$VERSION = '1.41'; +$VERSION = '1.42'; sub WritePS($$); sub ProcessPS($$;$); @@ -97,6 +97,31 @@ sub ProcessPS($$;$); Extracted with document metadata when ExtractEmbedded option is used }, }, + # AI metadata (most with a single leading '%') + AI9_ColorModel => { + Name => 'AIColorModel', + PrintConv => { + 1 => 'sRGB', + 2 => 'CMYK', + }, + }, + AI3_ColorUsage => { Name => 'AIColorUsage' }, + AI5_RulerUnits => { + Name => 'AIRulerUnits', + PrintConv => { + 0 => 'Inches', + 1 => 'Millimeters', + 2 => 'Points', + 3 => 'Picas', + 4 => 'Centimeters', + 6 => 'Pixels', + }, + }, + AI5_TargetResolution => { Name => 'AITargetResolution' }, + AI5_NumLayers => { Name => 'AINumLayers' }, + AI5_FileFormat => { Name => 'AIFileFormat' }, + AI8_CreatorVersion => { Name => 'AICreatorVersion' }, # (double leading '%') + AI12_BuildNumber => { Name => 'AIBuildNumber' }, ); # composite tags @@ -543,8 +568,8 @@ sub ProcessPS($$;$) next unless $data =~ m{<\?xpacket end=.(w|r).\?>($/|$)}; } elsif ($data =~ /^%%?(\w+): ?(.*)/s and $$tagTablePtr{$1}) { my ($tag, $val) = ($1, $2); - # only allow 'ImageData' to have single leading '%' - next unless $data =~ /^%%/ or $1 eq 'ImageData'; + # only allow 'ImageData' and AI tags to have single leading '%' + next unless $data =~ /^%(%|AI\d+_)/ or $tag eq 'ImageData'; # decode comment string (reading continuation lines if necessary) $val = DecodeComment($val, $raf, \@lines); $et->HandleTag($tagTablePtr, $tag, $val); diff --git a/lib/Image/ExifTool/QuickTime.pm b/lib/Image/ExifTool/QuickTime.pm index cfc4c780..8ac2b6f7 100644 --- a/lib/Image/ExifTool/QuickTime.pm +++ b/lib/Image/ExifTool/QuickTime.pm @@ -578,6 +578,10 @@ my %eeBox = ( return \$str; }, }, + udat => { #PH (GPS NMEA-format log written by Datakam Player software) + Name => 'GPSLog', + Binary => 1, # (actually ASCII, but very lengthy) + }, # meta - proprietary XML information written by some Flip cameras - PH ); diff --git a/lib/Image/ExifTool/QuickTimeStream.pl b/lib/Image/ExifTool/QuickTimeStream.pl index c9b268bb..78c974e7 100644 --- a/lib/Image/ExifTool/QuickTimeStream.pl +++ b/lib/Image/ExifTool/QuickTimeStream.pl @@ -59,9 +59,10 @@ my $mpsToKph = 3.6; # m/s --> km/h %Image::ExifTool::QuickTime::Stream = ( GROUPS => { 2 => 'Location' }, NOTES => q{ - Timed metadata extracted from QuickTime movie data and BikeBro AVI videos - when the ExtractEmbedded option is used. + Timed metadata extracted from QuickTime movie data and some AVI videos when + the ExtractEmbedded option is used. }, + VARS => { NO_ID => 1 }, GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")' }, GPSLongitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")' }, GPSAltitude => { PrintConv => '(sprintf("%.4f", $val) + 0) . " m"' }, # round to 4 decimals @@ -109,18 +110,18 @@ my $mpsToKph = 3.6; # m/s --> km/h Name => 'CTMD', SubDirectory => { TagTable => 'Image::ExifTool::Canon::CTMD' }, }, - RVMI => [{ # data "OtherFormat" written by E-PRANCE B47FS editing app - Name => 'RVMI_g', + RVMI => [{ # data "OtherFormat" written by unknown software + Name => 'RVMI_gReV', Condition => '$$valPt =~ /^gReV/', # GPS data SubDirectory => { - TagTable => 'Image::ExifTool::QuickTime::RVMI_g', + TagTable => 'Image::ExifTool::QuickTime::RVMI_gReV', ByteOrder => 'Little-endian', }, },{ - Name => 'RVMI_s', - Condition => '$$valPt =~ /^sReV/', # sensor data? + Name => 'RVMI_sReV', + Condition => '$$valPt =~ /^sReV/', # sensor data SubDirectory => { - TagTable => 'Image::ExifTool::QuickTime::RVMI_s', + TagTable => 'Image::ExifTool::QuickTime::RVMI_sReV', ByteOrder => 'Little-endian', }, # (there is also "tReV" data that hasn't been decoded yet) @@ -146,8 +147,8 @@ my $mpsToKph = 3.6; # m/s --> km/h GROUPS => { 2 => 'Location' }, FIRST_ENTRY => 0, NOTES => q{ - These tags are extracted from record type 6 of the 'camm' timed metadata of - MP4 videos from the Insta360. + Tags extracted from record type 6 of the 'camm' timed metadata of MP4 videos + from cameras such as the Insta360. }, # 0x0c - int32u, seen: 3 (GPSMeasureMode?) 0x10 => { @@ -171,10 +172,13 @@ my $mpsToKph = 3.6; # m/s --> km/h ); # tags found in 'RVMI' 'gReV' timed metadata (ref PH) -%Image::ExifTool::QuickTime::RVMI_g = ( +%Image::ExifTool::QuickTime::RVMI_gReV = ( PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, GROUPS => { 2 => 'Location' }, FIRST_ENTRY => 0, + NOTES => q{ + GPS information extracted from the RVMI box of MOV videos. + }, 4 => { Name => 'GPSLatitude', Format => 'int32s', @@ -201,10 +205,13 @@ my $mpsToKph = 3.6; # m/s --> km/h ); # tags found in 'RVMI' 'sReV' timed metadata (ref PH) -%Image::ExifTool::QuickTime::RVMI_s = ( +%Image::ExifTool::QuickTime::RVMI_sReV = ( PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, GROUPS => { 2 => 'Location' }, FIRST_ENTRY => 0, + NOTES => q{ + G-sensor information extracted from the RVMI box of MOV videos. + }, 4 => { Name => 'GSensor', Format => 'int16s[3]', # X Y Z @@ -445,7 +452,7 @@ sub ProcessSamples($) # based on known value of 4th-last char = '*' my $dif = ord('*') - ord(substr($buff, -4, 1)); my $tmp = pack 'C*',map { $_=($_+$dif)&0xff } unpack 'C*',substr $buff,1,-1; - if ($tmp =~ /^(.*?)(\$GPRMC.*)/s) { + if ($tmp =~ /^(.*?)(\$[A-Z]{2}RMC.*)/s) { ($val, $buff) = ($1, $2); $val =~ tr/\t/ /; $et->HandleTag($tagTbl, RawGSensor => $val) if length $val; @@ -458,7 +465,7 @@ sub ProcessSamples($) } while ($buff =~ /\$(\w+)([^\$]*)/g) { my ($tag, $dat) = ($1, $2); - if ($tag eq 'GPRMC' and $dat =~ /^,(\d{2})(\d{2})(\d+(\.\d*)?),A?,(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),(\d*\.?\d*),(\d*\.?\d*),(\d{2})(\d{2})(\d+)/) { + if ($tag =~ /^[A-Z]{2}RMC$/ and $dat =~ /^,(\d{2})(\d{2})(\d+(\.\d*)?),A?,(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),(\d*\.?\d*),(\d*\.?\d*),(\d{2})(\d{2})(\d+)/) { $et->HandleTag($tagTbl, GPSLatitude => (($5 || 0) + $6/60) * ($7 eq 'N' ? 1 : -1)); $et->HandleTag($tagTbl, GPSLongitude => (($8 || 0) + $9/60) * ($10 eq 'E' ? 1 : -1)); if (length $11) { diff --git a/lib/Image/ExifTool/TagLookup.pm b/lib/Image/ExifTool/TagLookup.pm index ec98d56e..b54c2d10 100644 --- a/lib/Image/ExifTool/TagLookup.pm +++ b/lib/Image/ExifTool/TagLookup.pm @@ -1189,7 +1189,7 @@ my %tagLookup = ( 'chromaticaberrationb' => { 432 => 'ChromaticAberrationB' }, 'chromaticaberrationblue' => { 97 => 0x20708, 103 => 0x6b }, 'chromaticaberrationcorr' => { 74 => [0x4,0x5] }, - 'chromaticaberrationcorrection' => { 313 => 0x1 }, + 'chromaticaberrationcorrection' => { 113 => 0x7034, 313 => 0x1 }, 'chromaticaberrationcorrparams' => { 113 => 0x7035, 407 => 0x66a, 408 => [0x37c,0x384,0x39c,0x3b0,0x3b8] }, 'chromaticaberrationon' => { 97 => '0x20703.0', 103 => 0x62 }, 'chromaticaberrationr' => { 432 => 'ChromaticAberrationR' }, @@ -1876,7 +1876,7 @@ my %tagLookup = ( 'distance4' => { 129 => 0x34 }, 'distortion' => { 356 => 0xa050 }, 'distortioncontrol' => { 213 => 0x10 }, - 'distortioncorrection' => { 97 => 0x20705, 103 => 0x67, 268 => 0x50b, 292 => '7.1', 313 => 0x0, 407 => 0x601, 408 => 0x5b }, + 'distortioncorrection' => { 97 => 0x20705, 103 => 0x67, 113 => 0x7036, 268 => 0x50b, 292 => '7.1', 313 => 0x0, 407 => 0x601, 408 => 0x5b }, 'distortioncorrection2' => { 272 => 0x1011 }, 'distortioncorrectionalreadyapplied' => { 428 => 'DistortionCorrectionAlreadyApplied' }, 'distortioncorrectionon' => { 97 => '0x20705.0', 103 => 0x63 }, @@ -5191,7 +5191,7 @@ my %tagLookup = ( 'vignettecorrectionalreadyapplied' => { 428 => 'VignetteCorrectionAlreadyApplied' }, 'vignettemidpoint' => { 432 => 'VignetteMidpoint' }, 'vignetting' => { 349 => 0x1011, 356 => 0xa052 }, - 'vignettingcorrection' => { 356 => 0xa053, 379 => 0x2011 }, + 'vignettingcorrection' => { 113 => 0x7031, 356 => 0xa053, 379 => 0x2011 }, 'vignettingcorrparams' => { 113 => 0x7032, 407 => 0x64a, 408 => [0x34a,0x350,0x35c,0x368] }, 'vignettingsetting' => { 356 => 0xa054 }, 'visualcolor' => { 442 => 'VisualColour' }, @@ -5533,9 +5533,17 @@ my %tagExists = ( 'afstatus19' => 1, 'afstatus79' => 1, 'aftune' => 1, + 'aibuildnumber' => 1, + 'aicolormodel' => 1, + 'aicolorusage' => 1, + 'aicreatorversion' => 1, + 'aifileformat' => 1, 'aimetadata' => 1, + 'ainumlayers' => 1, 'aipdfprivatedata' => 1, 'aiprivatedata' => 1, + 'airulerunits' => 1, + 'aitargetresolution' => 1, 'album2' => 1, 'albumartist' => 1, 'albumartistsortorder' => 1, @@ -7047,6 +7055,7 @@ my %tagExists = ( 'gpsdatetimeraw' => 1, 'gpsinfo' => 1, 'gpslatituderaw' => 1, + 'gpslog' => 1, 'gpslongituderaw' => 1, 'gpspos' => 1, 'gpsposition' => 1, @@ -8646,8 +8655,8 @@ my %tagExists = ( 'runtimesincepowerup' => 1, 'runtimevalue' => 1, 'runwindow' => 1, - 'rvmi_g' => 1, - 'rvmi_s' => 1, + 'rvmi_grev' => 1, + 'rvmi_srev' => 1, 's2n' => 1, 'sampledegradationpriority' => 1, 'sampleduration' => 1, diff --git a/lib/Image/ExifTool/TagNames.pod b/lib/Image/ExifTool/TagNames.pod index ee0ed5dd..0925ae18 100644 --- a/lib/Image/ExifTool/TagNames.pod +++ b/lib/Image/ExifTool/TagNames.pod @@ -445,8 +445,11 @@ official EXIF 2.31 specification. 0x4749 RatingPercent IFD0 int16u/ 0x7000 SonyRawFileType - no 0x7010 SonyToneCurve - no + 0x7031 VignettingCorrection SubIFD int16s! 0x7032 VignettingCorrParams SubIFD int16s[17]! + 0x7034 ChromaticAberrationCorrection SubIFD int16s! 0x7035 ChromaticAberrationCorrParams SubIFD int16s[33]! + 0x7036 DistortionCorrection SubIFD int16s! 0x7037 DistortionCorrParams SubIFD int16s[17]! 0x800d ImageID - no 0x80a3 WangTag1 - no @@ -6980,6 +6983,7 @@ SX280, and CR3 images from cameras such as the EOS M50. 'CMT3' MakerNoteCanon Canon 'CMT4' GPSInfo GPS 'CNCV' CompressorVersion no + 'CNOP' CanonCNOP Canon CNOP 'CNTH' CanonCNTH Canon CNTH 'THMB' ThumbnailImage no @@ -20047,6 +20051,9 @@ these tags, units may be added in brackets immediately following the value (eg. C<55(mi/h)>). If no units are specified, the default units are written. +4) ExifTool writes compressed metadata to MIE files if the Compress (-z) +option is used and Compress::Zlib is available. + See L<http://owl.phy.queensu.ca/~phil/exiftool/MIE1.1-20070121.pdf> for the official MIE specification. @@ -21749,28 +21756,36 @@ Additional document permissions imposed by digital signatures. =head2 PostScript Tags - Tag ID Tag Name Writable - ------ -------- -------- - 'Author' Author string - 'BeginDocument' EmbeddedFile PostScript - 'BeginICCProfile' ICC_Profile ICC_Profile - 'BeginPhotoshop' PhotoshopData Photoshop - 'BoundingBox' BoundingBox no - 'Copyright' Copyright string - 'CreationDate' CreateDate string - 'Creator' Creator string - 'EmbeddedFileName' EmbeddedFileName no - 'For' For string - 'ImageData' ImageData no - 'Keywords' Keywords string - 'ModDate' ModifyDate string - 'Pages' Pages no - 'Routing' Routing string - 'Subject' Subject string - 'TIFFPreview' TIFFPreview no - 'Title' Title string - 'Version' Version string - 'begin_xml_packet' XMP XMP + Tag ID Tag Name Writable + ------ -------- -------- + 'AI12_BuildNumber' AIBuildNumber no + 'AI3_ColorUsage' AIColorUsage no + 'AI5_FileFormat' AIFileFormat no + 'AI5_NumLayers' AINumLayers no + 'AI5_RulerUnits' AIRulerUnits no + 'AI5_TargetResolution' AITargetResolution no + 'AI8_CreatorVersion' AICreatorVersion no + 'AI9_ColorModel' AIColorModel no + 'Author' Author string + 'BeginDocument' EmbeddedFile PostScript + 'BeginICCProfile' ICC_Profile ICC_Profile + 'BeginPhotoshop' PhotoshopData Photoshop + 'BoundingBox' BoundingBox no + 'Copyright' Copyright string + 'CreationDate' CreateDate string + 'Creator' Creator string + 'EmbeddedFileName' EmbeddedFileName no + 'For' For string + 'ImageData' ImageData no + 'Keywords' Keywords string + 'ModDate' ModifyDate string + 'Pages' Pages no + 'Routing' Routing string + 'Subject' Subject string + 'TIFFPreview' TIFFPreview no + 'Title' Title string + 'Version' Version string + 'begin_xml_packet' XMP XMP =head2 ID3 Tags @@ -22647,6 +22662,7 @@ for the official specification. 'skip' CanonSkip Canon Skip Skip? no 'thum' ThumbnailImage no + 'udat' GPSLog no 'udta' UserData FLIR UserData 'uuid' XMP XMP UUID-PROF QuickTime Profile @@ -23720,37 +23736,39 @@ Tags used in QTIF QuickTime Image Files. =head3 QuickTime Stream Tags -Timed metadata extracted from QuickTime movie data and BikeBro AVI videos -when the ExtractEmbedded option is used. +Timed metadata extracted from QuickTime movie data and some AVI videos when +the ExtractEmbedded option is used. - Tag ID Tag Name Writable - ------ -------- -------- - 'Accelerometer' Accelerometer no - 'CTMD' CTMD Canon CTMD - 'FrameNumber' FrameNumber no - 'GPSAltitude' GPSAltitude no - 'GPSDateTime' GPSDateTime no - 'GPSLatitude' GPSLatitude no - 'GPSLongitude' GPSLongitude no - 'GPSSpeed' GPSSpeed no - 'GPSSpeedRef' GPSSpeedRef no - 'GPSTrack' GPSTrack no - 'GPSTrackRef' GPSTrackRef no - 'JPEG' JpgFromRaw no - 'RVMI' RVMI_g QuickTime RVMI_g - RVMI_s QuickTime RVMI_s - 'RawGSensor' RawGSensor no - 'SampleDuration' SampleDuration no - 'SampleTime' SampleTime no - 'Text' Text no - 'TimeCode' TimeCode no - 'camm' camm6 QuickTime camm6 - 'fdsc' fdsc GoPro fdsc - 'gpmd' gpmd GoPro GPMF - 'mebx' mebx QuickTime Keys - 'rtmd' rtmd Sony rtmd - -=head3 QuickTime RVMI_g Tags + Tag Name Writable + -------- -------- + Accelerometer no + CTMD Canon CTMD + FrameNumber no + GPSAltitude no + GPSDateTime no + GPSLatitude no + GPSLongitude no + GPSSpeed no + GPSSpeedRef no + GPSTrack no + GPSTrackRef no + JpgFromRaw no + RVMI_gReV QuickTime RVMI_gReV + RVMI_sReV QuickTime RVMI_sReV + RawGSensor no + SampleDuration no + SampleTime no + Text no + TimeCode no + camm6 QuickTime camm6 + fdsc GoPro fdsc + gpmd GoPro GPMF + mebx QuickTime Keys + rtmd Sony rtmd + +=head3 QuickTime RVMI_gReV Tags + +GPS information extracted from the RVMI box of MOV videos. Index1 Tag Name Writable ------ -------- -------- @@ -23759,7 +23777,9 @@ when the ExtractEmbedded option is used. 16 GPSSpeed no 18 GPSTrack no -=head3 QuickTime RVMI_s Tags +=head3 QuickTime RVMI_sReV Tags + +G-sensor information extracted from the RVMI box of MOV videos. Index1 Tag Name Writable ------ -------- -------- @@ -23767,8 +23787,8 @@ when the ExtractEmbedded option is used. =head3 QuickTime camm6 Tags -These tags are extracted from record type 6 of the 'camm' timed metadata of -MP4 videos from the Insta360. +Tags extracted from record type 6 of the 'camm' timed metadata of MP4 videos +from cameras such as the Insta360. Index1 Tag Name Writable ------ -------- -------- diff --git a/lib/Image/ExifTool/ZIP.pm b/lib/Image/ExifTool/ZIP.pm index fec60a2a..63083536 100644 --- a/lib/Image/ExifTool/ZIP.pm +++ b/lib/Image/ExifTool/ZIP.pm @@ -19,7 +19,7 @@ use strict; use vars qw($VERSION $warnString); use Image::ExifTool qw(:DataAccess :Utils); -$VERSION = '1.19'; +$VERSION = '1.20'; sub WarnProc($) { $warnString = $_[0]; } @@ -92,7 +92,7 @@ my %openDocType = ( ($val >> 16) & 0x1f, # day ($val >> 11) & 0x1f, # hour ($val >> 5) & 0x3f, # minute - $val & 0x1f # second + ($val & 0x1f) * 2 # second ); }, PrintConv => '$self->ConvertDateTime($val)', @@ -210,7 +210,7 @@ my %openDocType = ( ($val >> 16) & 0x1f, # day ($val >> 11) & 0x1f, # hour ($val >> 5) & 0x3f, # minute - $val & 0x1f # second + ($val & 0x1f) * 2 # second ); }, PrintConv => '$self->ConvertDateTime($val)', |