exiftool_vendored 11.98.0 → 12.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/Changes +198 -2
- data/bin/MANIFEST +8 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +43 -42
- data/bin/exiftool +102 -75
- data/bin/lib/Image/ExifTool.pm +163 -111
- data/bin/lib/Image/ExifTool.pod +127 -93
- data/bin/lib/Image/ExifTool/AIFF.pm +2 -2
- data/bin/lib/Image/ExifTool/APE.pm +2 -2
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +21 -10
- data/bin/lib/Image/ExifTool/Canon.pm +202 -14
- data/bin/lib/Image/ExifTool/CanonCustom.pm +82 -16
- data/bin/lib/Image/ExifTool/DPX.pm +56 -2
- data/bin/lib/Image/ExifTool/DarwinCore.pm +22 -3
- data/bin/lib/Image/ExifTool/EXE.pm +8 -5
- data/bin/lib/Image/ExifTool/Exif.pm +15 -6
- data/bin/lib/Image/ExifTool/Font.pm +9 -2
- data/bin/lib/Image/ExifTool/GIF.pm +6 -1
- data/bin/lib/Image/ExifTool/GeoTiff.pm +2 -0
- data/bin/lib/Image/ExifTool/Geotag.pm +2 -2
- data/bin/lib/Image/ExifTool/GoPro.pm +48 -22
- data/bin/lib/Image/ExifTool/H264.pm +1 -1
- data/bin/lib/Image/ExifTool/ID3.pm +91 -12
- data/bin/lib/Image/ExifTool/IPTC.pm +1 -0
- data/bin/lib/Image/ExifTool/JSON.pm +27 -4
- data/bin/lib/Image/ExifTool/Lang/de.pm +3 -1
- data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
- data/bin/lib/Image/ExifTool/M2TS.pm +19 -19
- data/bin/lib/Image/ExifTool/MacOS.pm +154 -38
- data/bin/lib/Image/ExifTool/Matroska.pm +3 -1
- data/bin/lib/Image/ExifTool/Minolta.pm +7 -2
- data/bin/lib/Image/ExifTool/MinoltaRaw.pm +11 -10
- data/bin/lib/Image/ExifTool/Nikon.pm +164 -20
- data/bin/lib/Image/ExifTool/Olympus.pm +39 -17
- data/bin/lib/Image/ExifTool/PNG.pm +14 -3
- data/bin/lib/Image/ExifTool/PPM.pm +5 -5
- data/bin/lib/Image/ExifTool/Panasonic.pm +148 -14
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +34 -0
- data/bin/lib/Image/ExifTool/Parrot.pm +2 -1
- data/bin/lib/Image/ExifTool/Pentax.pm +3 -1
- data/bin/lib/Image/ExifTool/Photoshop.pm +2 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +289 -37
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +419 -60
- data/bin/lib/Image/ExifTool/README +26 -22
- data/bin/lib/Image/ExifTool/RSRC.pm +17 -11
- data/bin/lib/Image/ExifTool/RTF.pm +12 -7
- data/bin/lib/Image/ExifTool/Radiance.pm +7 -2
- data/bin/lib/Image/ExifTool/Ricoh.pm +19 -1
- data/bin/lib/Image/ExifTool/Shift.pl +1 -0
- data/bin/lib/Image/ExifTool/SigmaRaw.pm +40 -33
- data/bin/lib/Image/ExifTool/Sony.pm +426 -40
- data/bin/lib/Image/ExifTool/TagLookup.pm +5799 -5671
- data/bin/lib/Image/ExifTool/TagNames.pod +584 -97
- data/bin/lib/Image/ExifTool/Validate.pm +4 -4
- data/bin/lib/Image/ExifTool/WriteExif.pl +3 -2
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +26 -18
- data/bin/lib/Image/ExifTool/Writer.pl +47 -24
- data/bin/lib/Image/ExifTool/XMP.pm +99 -17
- data/bin/lib/Image/ExifTool/XMP2.pl +1 -0
- data/bin/lib/Image/ExifTool/XMPStruct.pl +3 -1
- data/bin/lib/Image/ExifTool/ZISRAW.pm +123 -0
- data/bin/perl-Image-ExifTool.spec +42 -41
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +8 -7
|
@@ -11,7 +11,7 @@ package Image::ExifTool::Lang::de;
|
|
|
11
11
|
use strict;
|
|
12
12
|
use vars qw($VERSION);
|
|
13
13
|
|
|
14
|
-
$VERSION = '1.
|
|
14
|
+
$VERSION = '1.36';
|
|
15
15
|
|
|
16
16
|
%Image::ExifTool::Lang::de::Translate = (
|
|
17
17
|
'AEAperture' => 'AE-Blende',
|
|
@@ -993,7 +993,9 @@ $VERSION = '1.35';
|
|
|
993
993
|
},
|
|
994
994
|
},
|
|
995
995
|
'AdvancedSceneMode' => {
|
|
996
|
+
Description => 'Erweiteter Szenenmodus',
|
|
996
997
|
PrintConv => {
|
|
998
|
+
'Off' => 'Aus',
|
|
997
999
|
'Creative Macro' => 'Makro kreativ',
|
|
998
1000
|
'Flower' => 'Blumen',
|
|
999
1001
|
'HDR B&W' => 'HDR Schwarz-Weiß',
|
|
@@ -1302,7 +1302,7 @@ $VERSION = '1.16';
|
|
|
1302
1302
|
'ExifImageHeight' => 'Alto Imagen',
|
|
1303
1303
|
'ExifImageWidth' => 'Ancho Imagen',
|
|
1304
1304
|
'ExifOffset' => 'Puntero Exif IFD',
|
|
1305
|
-
'ExifToolVersion' => 'Versión
|
|
1305
|
+
'ExifToolVersion' => 'Versión ExifTool',
|
|
1306
1306
|
'ExifVersion' => 'Versión Exif',
|
|
1307
1307
|
'ExpandFilm' => 'Película Expandida',
|
|
1308
1308
|
'ExpandFilterLens' => 'Filtro Objetivo Expandida',
|
|
@@ -31,7 +31,7 @@ use strict;
|
|
|
31
31
|
use vars qw($VERSION);
|
|
32
32
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
33
33
|
|
|
34
|
-
$VERSION = '1.
|
|
34
|
+
$VERSION = '1.18';
|
|
35
35
|
|
|
36
36
|
# program map table "stream_type" lookup (ref 6/1)
|
|
37
37
|
my %streamType = (
|
|
@@ -262,7 +262,7 @@ sub ParseAC3Descriptor($$)
|
|
|
262
262
|
|
|
263
263
|
#------------------------------------------------------------------------------
|
|
264
264
|
# Parse PID stream data
|
|
265
|
-
# Inputs: 0)
|
|
265
|
+
# Inputs: 0) ExifTool ref, 1) PID number, 2) PID type, 3) PID name, 4) data ref
|
|
266
266
|
# Returns: 0=stream parsed OK,
|
|
267
267
|
# 1=stream parsed but we want to parse more of these,
|
|
268
268
|
# -1=can't parse yet because we don't know the type
|
|
@@ -359,23 +359,26 @@ sub ProcessM2TS($$)
|
|
|
359
359
|
last unless defined $startTime;
|
|
360
360
|
# reconfigure to seek backwards for last PCR
|
|
361
361
|
unless (defined $backScan) {
|
|
362
|
-
$
|
|
363
|
-
$verbose and print "[Starting backscan for last PCR]\n";
|
|
364
|
-
$fwdTime = $endTime;
|
|
362
|
+
my $saveTime = $endTime;
|
|
365
363
|
undef $endTime;
|
|
364
|
+
last if $et->Options('FastScan');
|
|
365
|
+
$verbose and print $out "[Starting backscan for last PCR]\n";
|
|
366
366
|
# remember how far we got when reading forward through the file
|
|
367
367
|
my $fwdPos = $raf->Tell() - length($buff) + $pEnd;
|
|
368
|
-
# determine the
|
|
368
|
+
# determine the position of the last packet relative to the EOF
|
|
369
369
|
$raf->Seek(0, 2) or last;
|
|
370
370
|
my $fsize = $raf->Tell();
|
|
371
|
-
|
|
372
|
-
$backScan = $nPack * $pLen - $fsize;
|
|
371
|
+
$backScan = int($fsize / $pLen) * $pLen - $fsize;
|
|
373
372
|
# set limit on how far back we will go
|
|
374
373
|
$maxBack = $fwdPos - $fsize;
|
|
375
374
|
# scan back a maximum of 512k (have seen last PCR at -276k)
|
|
376
|
-
my $nMax = int(512000 / $pLen); # max packets to
|
|
377
|
-
|
|
378
|
-
|
|
375
|
+
my $nMax = int(512000 / $pLen); # max packets to backscan
|
|
376
|
+
if ($nMax < int(-$maxBack / $pLen)) {
|
|
377
|
+
$maxBack = $backScan - $nMax * $pLen;
|
|
378
|
+
} else {
|
|
379
|
+
# use this time if none found in all remaining packets
|
|
380
|
+
$fwdTime = $saveTime;
|
|
381
|
+
}
|
|
379
382
|
$pEnd = 0;
|
|
380
383
|
}
|
|
381
384
|
}
|
|
@@ -387,15 +390,12 @@ sub ProcessM2TS($$)
|
|
|
387
390
|
if ($pos < 0) {
|
|
388
391
|
# read another buffer from end of file
|
|
389
392
|
last if $backScan <= $maxBack;
|
|
390
|
-
my $
|
|
391
|
-
$
|
|
392
|
-
|
|
393
|
-
$readThis = $readSize - ($maxBack - $backScan);
|
|
394
|
-
$backScan = $maxBack;
|
|
395
|
-
}
|
|
393
|
+
my $buffLen = $backScan - $maxBack;
|
|
394
|
+
$buffLen = $readSize if $buffLen > $readSize;
|
|
395
|
+
$backScan -= $buffLen;
|
|
396
396
|
$raf->Seek($backScan, 2) or last;
|
|
397
|
-
$raf->Read($buff, $
|
|
398
|
-
$pos = $pEnd = $
|
|
397
|
+
$raf->Read($buff, $buffLen) == $buffLen or last;
|
|
398
|
+
$pos = $pEnd = $buffLen - $pLen;
|
|
399
399
|
}
|
|
400
400
|
} else {
|
|
401
401
|
$pos = $pEnd;
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
# Description: Read/write MacOS system tags
|
|
5
5
|
#
|
|
6
6
|
# Revisions: 2017/03/01 - P. Harvey Created
|
|
7
|
+
# 2020/10/13 - PH Added ability to read MacOS "._" files
|
|
7
8
|
#------------------------------------------------------------------------------
|
|
8
9
|
|
|
9
10
|
package Image::ExifTool::MacOS;
|
|
@@ -11,15 +12,38 @@ use strict;
|
|
|
11
12
|
use vars qw($VERSION);
|
|
12
13
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
13
14
|
|
|
14
|
-
$VERSION = '1.
|
|
15
|
+
$VERSION = '1.11';
|
|
15
16
|
|
|
16
17
|
sub MDItemLocalTime($);
|
|
18
|
+
sub ProcessATTR($$$);
|
|
17
19
|
|
|
18
20
|
my %mdDateInfo = (
|
|
19
21
|
ValueConv => \&MDItemLocalTime,
|
|
20
22
|
PrintConv => '$self->ConvertDateTime($val)',
|
|
21
23
|
);
|
|
22
24
|
|
|
25
|
+
# Information decoded from Mac OS sidecar files
|
|
26
|
+
%Image::ExifTool::MacOS::Main = (
|
|
27
|
+
GROUPS => { 0 => 'File', 1 => 'MacOS' },
|
|
28
|
+
NOTES => q{
|
|
29
|
+
Note that on some filesystems, MacOS creates sidecar files with names that
|
|
30
|
+
begin with "._". ExifTool will read these files if specified, and extract
|
|
31
|
+
the information listed in the following table without the need for extra
|
|
32
|
+
options, but these files are not writable directly.
|
|
33
|
+
},
|
|
34
|
+
2 => {
|
|
35
|
+
Name => 'RSRC',
|
|
36
|
+
SubDirectory => { TagTable => 'Image::ExifTool::RSRC::Main' },
|
|
37
|
+
},
|
|
38
|
+
9 => {
|
|
39
|
+
Name => 'ATTR',
|
|
40
|
+
SubDirectory => {
|
|
41
|
+
TagTable => 'Image::ExifTool::MacOS::XAttr',
|
|
42
|
+
ProcessProc => \&ProcessATTR,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
);
|
|
46
|
+
|
|
23
47
|
# "mdls" tags (ref PH)
|
|
24
48
|
%Image::ExifTool::MacOS::MDItem = (
|
|
25
49
|
WRITE_PROC => \&Image::ExifTool::DummyWriteProc,
|
|
@@ -221,6 +245,8 @@ my %mdDateInfo = (
|
|
|
221
245
|
XAttr tags are extracted using the "xattr" utility. They are extracted if
|
|
222
246
|
any "XAttr*" tag or the MacOS group is specifically requested, or by setting
|
|
223
247
|
the L<XAttrTags|../ExifTool.html#XAttrTags> API option to 1 or the L<RequestAll|../ExifTool.html#RequestAll> API option to 2 or higher.
|
|
248
|
+
And they extracted by default from MacOS "._" files when reading
|
|
249
|
+
these files directly.
|
|
224
250
|
},
|
|
225
251
|
'com.apple.FinderInfo' => {
|
|
226
252
|
Name => 'XAttrFinderInfo',
|
|
@@ -325,7 +351,7 @@ sub MDItemLocalTime($)
|
|
|
325
351
|
|
|
326
352
|
#------------------------------------------------------------------------------
|
|
327
353
|
# Set MacOS MDItem and XAttr tags from new tag values
|
|
328
|
-
# Inputs: 0)
|
|
354
|
+
# Inputs: 0) ExifTool ref, 1) file name, 2) list of tags to set
|
|
329
355
|
# Returns: 1=something was set OK, 0=didn't try, -1=error (and warning set)
|
|
330
356
|
# Notes: There may be errors even if 1 is returned
|
|
331
357
|
sub SetMacOSTags($$$)
|
|
@@ -486,8 +512,50 @@ sub ExtractMDItemTags($$)
|
|
|
486
512
|
$$et{INDENT} =~ s/\| $//;
|
|
487
513
|
}
|
|
488
514
|
|
|
515
|
+
|
|
516
|
+
#------------------------------------------------------------------------------
|
|
517
|
+
# Read MacOS XAttr value
|
|
518
|
+
# Inputs: 0) ExifTool object ref, 1) file name
|
|
519
|
+
sub ReadXAttrValue($$$$)
|
|
520
|
+
{
|
|
521
|
+
my ($et, $tagTablePtr, $tag, $val) = @_;
|
|
522
|
+
# add to our table if necessary
|
|
523
|
+
unless ($$tagTablePtr{$tag}) {
|
|
524
|
+
my $name;
|
|
525
|
+
# generate tag name from attribute name
|
|
526
|
+
if ($tag =~ /^com\.apple\.(.*)$/) {
|
|
527
|
+
($name = $1) =~ s/^metadata:_?k//;
|
|
528
|
+
$name =~ s/^metadata:(com_)?//;
|
|
529
|
+
} else {
|
|
530
|
+
$name = $tag;
|
|
531
|
+
}
|
|
532
|
+
$name =~ s/[.:_]([a-z])/\U$1/g;
|
|
533
|
+
$name = 'XAttr' . ucfirst $name;
|
|
534
|
+
my %tagInfo = ( Name => $name );
|
|
535
|
+
$tagInfo{Groups} = { 2 => 'Time' } if $tag=~/Date$/;
|
|
536
|
+
$et->VPrint(0, " [adding $tag]\n");
|
|
537
|
+
AddTagToTable($tagTablePtr, $tag, \%tagInfo);
|
|
538
|
+
}
|
|
539
|
+
if ($val =~ /^bplist0/) {
|
|
540
|
+
my %dirInfo = ( DataPt => \$val );
|
|
541
|
+
require Image::ExifTool::PLIST;
|
|
542
|
+
if (Image::ExifTool::PLIST::ProcessBinaryPLIST($et, \%dirInfo, $tagTablePtr)) {
|
|
543
|
+
return undef if ref $dirInfo{Value} eq 'HASH';
|
|
544
|
+
$val = $dirInfo{Value}
|
|
545
|
+
} else {
|
|
546
|
+
$et->Warn("Error decoding $$tagTablePtr{$tag}{Name}");
|
|
547
|
+
return undef;
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
if (not ref $val and ($val =~ /\0/ or length($val) > 200) or $tag eq 'XAttrMDLabel') {
|
|
551
|
+
my $buff = $val;
|
|
552
|
+
$val = \$buff;
|
|
553
|
+
}
|
|
554
|
+
return $val;
|
|
555
|
+
}
|
|
556
|
+
|
|
489
557
|
#------------------------------------------------------------------------------
|
|
490
|
-
#
|
|
558
|
+
# Read MacOS extended attribute tags using 'xattr' utility
|
|
491
559
|
# Inputs: 0) ExifTool object ref, 1) file name
|
|
492
560
|
sub ExtractXAttrTags($$)
|
|
493
561
|
{
|
|
@@ -517,39 +585,8 @@ sub ExtractXAttrTags($$)
|
|
|
517
585
|
$val .= pack('H*', $_);
|
|
518
586
|
next;
|
|
519
587
|
} elsif ($tag and defined $val) {
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
my $name;
|
|
523
|
-
# generate tag name from attribute name
|
|
524
|
-
if ($tag =~ /^com\.apple\.(.*)$/) {
|
|
525
|
-
($name = $1) =~ s/^metadata:_?k//;
|
|
526
|
-
$name =~ s/^metadata:(com_)?//;
|
|
527
|
-
} else {
|
|
528
|
-
$name = $tag;
|
|
529
|
-
}
|
|
530
|
-
$name =~ s/[.:_]([a-z])/\U$1/g;
|
|
531
|
-
$name = 'XAttr' . ucfirst $name;
|
|
532
|
-
my %tagInfo = ( Name => $name );
|
|
533
|
-
$tagInfo{Groups} = { 2 => 'Time' } if $tag=~/Date$/;
|
|
534
|
-
$et->VPrint(0, " [adding $tag]\n");
|
|
535
|
-
AddTagToTable($tagTablePtr, $tag, \%tagInfo);
|
|
536
|
-
}
|
|
537
|
-
if ($val =~ /^bplist0/) {
|
|
538
|
-
my %dirInfo = ( DataPt => \$val );
|
|
539
|
-
require Image::ExifTool::PLIST;
|
|
540
|
-
if (Image::ExifTool::PLIST::ProcessBinaryPLIST($et, \%dirInfo, $tagTablePtr)) {
|
|
541
|
-
next if ref $dirInfo{Value} eq 'HASH';
|
|
542
|
-
$val = $dirInfo{Value}
|
|
543
|
-
} else {
|
|
544
|
-
$et->Warn("Error decoding $$tagTablePtr{$tag}{Name}");
|
|
545
|
-
next;
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
if (not ref $val and ($val =~ /\0/ or length($val) > 200) or $tag eq 'XAttrMDLabel') {
|
|
549
|
-
my $buff = $val;
|
|
550
|
-
$val = \$buff;
|
|
551
|
-
}
|
|
552
|
-
$et->HandleTag($tagTablePtr, $tag, $val);
|
|
588
|
+
$val = ReadXAttrValue($et, $tagTablePtr, $tag, $val);
|
|
589
|
+
$et->HandleTag($tagTablePtr, $tag, $val) if defined $val;
|
|
553
590
|
undef $tag;
|
|
554
591
|
undef $val;
|
|
555
592
|
}
|
|
@@ -584,6 +621,84 @@ sub GetFileCreateDate($$)
|
|
|
584
621
|
delete $$et{SET_GROUP1};
|
|
585
622
|
}
|
|
586
623
|
|
|
624
|
+
#------------------------------------------------------------------------------
|
|
625
|
+
# Read ATTR metadata from "._" file
|
|
626
|
+
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
|
627
|
+
# Return: 1 on success
|
|
628
|
+
# (ref https://www.swiftforensics.com/2018/11/the-dot-underscore-file-format.html)
|
|
629
|
+
sub ProcessATTR($$$)
|
|
630
|
+
{
|
|
631
|
+
my ($et, $dirInfo, $tagTablePtr) = @_;
|
|
632
|
+
my $dataPt = $$dirInfo{DataPt};
|
|
633
|
+
my $dataPos = $$dirInfo{DataPos};
|
|
634
|
+
my $dataLen = length $$dataPt;
|
|
635
|
+
|
|
636
|
+
$dataLen >= 58 and $$dataPt =~ /^.{34}ATTR/s or $et->Warn('Invalid ATTR header'), return 0;
|
|
637
|
+
my $entries = Get32u($dataPt, 66);
|
|
638
|
+
$et->VerboseDir('ATTR', $entries);
|
|
639
|
+
# (Note: The RAF is not in $dirInfo because it would break RSRC reading --
|
|
640
|
+
# the RSCR block uses relative offsets, while the ATTR block uses absolute! grrr!)
|
|
641
|
+
my $raf = $$et{RAF};
|
|
642
|
+
my $pos = 70; # first entry is after ATTR header
|
|
643
|
+
my $i;
|
|
644
|
+
for ($i=0; $i<$entries; ++$i) {
|
|
645
|
+
$pos + 12 > $dataLen and $et->Warn('Truncated ATTR entry'), last;
|
|
646
|
+
my $off = Get32u($dataPt, $pos);
|
|
647
|
+
my $len = Get32u($dataPt, $pos + 4);
|
|
648
|
+
my $n = Get8u($dataPt, $pos + 10); # number of characters in tag name
|
|
649
|
+
$pos + 11 + $n > $dataLen and $et->Warn('Truncated ATTR name'), last;
|
|
650
|
+
$off -= $dataPos; # convert to relative offset (grrr!)
|
|
651
|
+
$off < 0 or $off > $dataLen and $et->Warn('Invalid ATTR offset'), last;
|
|
652
|
+
my $tag = substr($$dataPt, $pos + 11, $n);
|
|
653
|
+
$tag =~ s/\0+$//; # remove null terminator
|
|
654
|
+
# remove random ID after kMDLabel in tag ID
|
|
655
|
+
$tag =~ s/^com.apple.metadata:kMDLabel_.*/com.apple.metadata:kMDLabel/s;
|
|
656
|
+
$off + $len > $dataLen and $et->Warn('Truncated ATTR value'), last;
|
|
657
|
+
my $val = ReadXAttrValue($et, $tagTablePtr, $tag, substr($$dataPt, $off, $len));
|
|
658
|
+
$et->HandleTag($tagTablePtr, $tag, $val,
|
|
659
|
+
DataPt => $dataPt,
|
|
660
|
+
DataPos => $dataPos,
|
|
661
|
+
Start => $off,
|
|
662
|
+
Size => $len,
|
|
663
|
+
) if defined $val;
|
|
664
|
+
$pos += (11 + $n + 3) & -4; # step to next entry (on even 4-byte boundary)
|
|
665
|
+
}
|
|
666
|
+
return 1;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
#------------------------------------------------------------------------------
|
|
670
|
+
# Read information from a MacOS "._" sidecar file
|
|
671
|
+
# Inputs: 0) ExifTool ref, 1) dirInfo ref
|
|
672
|
+
# Returns: 1 on success, 0 if this wasn't a valid "._" file
|
|
673
|
+
# (ref https://www.swiftforensics.com/2018/11/the-dot-underscore-file-format.html)
|
|
674
|
+
sub ProcessMacOS($$)
|
|
675
|
+
{
|
|
676
|
+
my ($et, $dirInfo) = @_;
|
|
677
|
+
my $raf = $$dirInfo{RAF};
|
|
678
|
+
my ($hdr, $buff, $i);
|
|
679
|
+
|
|
680
|
+
return 0 unless $raf->Read($hdr, 26) == 26 and $hdr =~ /^\0\x05\x16\x07\0(.)\0\0Mac OS X /s;
|
|
681
|
+
my $ver = ord $1;
|
|
682
|
+
# (extension may be anything, so just echo back the incoming file extension if it exists)
|
|
683
|
+
$et->SetFileType(undef, undef, $$et{FILE_EXT});
|
|
684
|
+
$ver == 2 or $et->Warn("Unsupported file version $ver"), return 1;
|
|
685
|
+
SetByteOrder('MM');
|
|
686
|
+
my $tagTablePtr = GetTagTable('Image::ExifTool::MacOS::Main');
|
|
687
|
+
my $entries = Get16u(\$hdr, 0x18);
|
|
688
|
+
$et->VerboseDir('MacOS', $entries);
|
|
689
|
+
$raf->Read($hdr, $entries * 12) == $entries * 12 or $et->Warn('Truncated header'), return 1;
|
|
690
|
+
for ($i=0; $i<$entries; ++$i) {
|
|
691
|
+
my $pos = $i * 12;
|
|
692
|
+
my $tag = Get32u(\$hdr, $pos);
|
|
693
|
+
my $off = Get32u(\$hdr, $pos + 4);
|
|
694
|
+
my $len = Get32u(\$hdr, $pos + 8);
|
|
695
|
+
$len > 100000000 and $et->Warn('Record size too large'), last;
|
|
696
|
+
$raf->Seek($off,0) and $raf->Read($buff,$len) == $len or $et->Warn('Truncated record'), last;
|
|
697
|
+
$et->HandleTag($tagTablePtr, $tag, undef, DataPt => \$buff, DataPos => $off, Index => $i);
|
|
698
|
+
}
|
|
699
|
+
return 1;
|
|
700
|
+
}
|
|
701
|
+
|
|
587
702
|
1; # end
|
|
588
703
|
|
|
589
704
|
__END__
|
|
@@ -600,8 +715,9 @@ This module is used by Image::ExifTool
|
|
|
600
715
|
|
|
601
716
|
This module contains definitions required by Image::ExifTool to extract
|
|
602
717
|
MDItem* and XAttr* tags on MacOS systems using the "mdls" and "xattr"
|
|
603
|
-
utilities respectively.
|
|
604
|
-
|
|
718
|
+
utilities respectively. It also reads metadata directly from the MacOS "_."
|
|
719
|
+
sidecar files that are used on some filesystems to store file attributes.
|
|
720
|
+
Writable tags use "xattr", "setfile" or "osascript" for writing.
|
|
605
721
|
|
|
606
722
|
=head1 AUTHOR
|
|
607
723
|
|
|
@@ -14,7 +14,7 @@ use strict;
|
|
|
14
14
|
use vars qw($VERSION);
|
|
15
15
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
16
16
|
|
|
17
|
-
$VERSION = '1.
|
|
17
|
+
$VERSION = '1.10';
|
|
18
18
|
|
|
19
19
|
my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
20
20
|
|
|
@@ -221,6 +221,8 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
|
221
221
|
},
|
|
222
222
|
0x2e => {
|
|
223
223
|
Name => 'TrackEntry',
|
|
224
|
+
# reset TrackType member at the start of each track
|
|
225
|
+
Condition => 'delete $$self{TrackType}; 1',
|
|
224
226
|
SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
|
|
225
227
|
},
|
|
226
228
|
0x57 => { Name => 'TrackNumber', Format => 'unsigned' },
|
|
@@ -49,7 +49,7 @@ use vars qw($VERSION %minoltaLensTypes %minoltaTeleconverters %minoltaColorMode
|
|
|
49
49
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
50
50
|
use Image::ExifTool::Exif;
|
|
51
51
|
|
|
52
|
-
$VERSION = '2.
|
|
52
|
+
$VERSION = '2.87';
|
|
53
53
|
|
|
54
54
|
# Full list of product codes for Sony-compatible Minolta lenses
|
|
55
55
|
# (ref http://www.kb.sony.com/selfservice/documentLink.do?externalId=C1000570)
|
|
@@ -602,13 +602,18 @@ $VERSION = '2.83';
|
|
|
602
602
|
15 => 'Light', #JR (NC)
|
|
603
603
|
16 => 'Autumn Leaves', #JR (NC)
|
|
604
604
|
17 => 'Sepia', #JR
|
|
605
|
+
18 => 'FL', #JR (7SM3)
|
|
606
|
+
19 => 'Vivid 2', #JR (7SM3)
|
|
607
|
+
20 => 'IN', #JR (7SM3)
|
|
608
|
+
21 => 'SH', #JR (7SM3)
|
|
605
609
|
100 => 'Neutral', #JD
|
|
606
610
|
101 => 'Clear', #JD
|
|
607
611
|
102 => 'Deep', #JD
|
|
608
612
|
103 => 'Light', #JD
|
|
609
613
|
104 => 'Night View', #JD
|
|
610
614
|
105 => 'Autumn Leaves', #JD
|
|
611
|
-
|
|
615
|
+
255 => 'Off', #JR (new for ILCE-7SM3, July 2020)
|
|
616
|
+
0xffffffff => 'n/a', #PH
|
|
612
617
|
);
|
|
613
618
|
|
|
614
619
|
%minoltaSceneMode = (
|
|
@@ -17,7 +17,7 @@ use vars qw($VERSION);
|
|
|
17
17
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
18
18
|
use Image::ExifTool::Minolta;
|
|
19
19
|
|
|
20
|
-
$VERSION = '1.
|
|
20
|
+
$VERSION = '1.16';
|
|
21
21
|
|
|
22
22
|
sub ProcessMRW($$;$);
|
|
23
23
|
sub WriteMRW($$;$);
|
|
@@ -59,10 +59,12 @@ sub WriteMRW($$;$);
|
|
|
59
59
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
60
60
|
WRITABLE => 1,
|
|
61
61
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
62
|
+
DATAMEMBER => [ 0 ],
|
|
62
63
|
FIRST_ENTRY => 0,
|
|
63
64
|
0 => {
|
|
64
65
|
Name => 'FirmwareID',
|
|
65
66
|
Format => 'string[8]',
|
|
67
|
+
RawConv => '$$self{MinoltaPRD} = 1 if $$self{FILE_TYPE} eq "MRW"; $val', # used in decoding RIF info
|
|
66
68
|
},
|
|
67
69
|
8 => {
|
|
68
70
|
Name => 'SensorHeight',
|
|
@@ -214,38 +216,37 @@ sub WriteMRW($$;$);
|
|
|
214
216
|
PrintConv => \%Image::ExifTool::Minolta::sonyColorMode,
|
|
215
217
|
},
|
|
216
218
|
],
|
|
217
|
-
# NOTE:
|
|
219
|
+
# NOTE: WB_RBLevels up to Custom also apply to Minolta models which write PRD info (ref IB)
|
|
218
220
|
8 => { #3
|
|
219
221
|
Name => 'WB_RBLevelsTungsten',
|
|
220
|
-
Condition => '$$self{Model} eq "DSLR-A100"',
|
|
222
|
+
Condition => '$$self{Model} eq "DSLR-A100" or $$self{MinoltaPRD}',
|
|
221
223
|
Format => 'int16u[2]',
|
|
222
224
|
Notes => 'these WB_RBLevels currently decoded only for the Sony A100',
|
|
223
225
|
},
|
|
224
226
|
12 => { #3
|
|
225
227
|
Name => 'WB_RBLevelsDaylight',
|
|
226
|
-
Condition => '$$self{Model} eq "DSLR-A100"',
|
|
228
|
+
Condition => '$$self{Model} eq "DSLR-A100" or $$self{MinoltaPRD}',
|
|
227
229
|
Format => 'int16u[2]',
|
|
228
230
|
},
|
|
229
231
|
16 => { #3
|
|
230
232
|
Name => 'WB_RBLevelsCloudy',
|
|
231
|
-
Condition => '$$self{Model} eq "DSLR-A100"',
|
|
233
|
+
Condition => '$$self{Model} eq "DSLR-A100" or $$self{MinoltaPRD}',
|
|
232
234
|
Format => 'int16u[2]',
|
|
233
235
|
},
|
|
234
236
|
20 => { #3
|
|
235
237
|
Name => 'WB_RBLevelsCoolWhiteF',
|
|
236
|
-
Condition => '$$self{Model} eq "DSLR-A100"',
|
|
238
|
+
Condition => '$$self{Model} eq "DSLR-A100" or $$self{MinoltaPRD}',
|
|
237
239
|
Format => 'int16u[2]',
|
|
238
240
|
},
|
|
239
241
|
24 => { #3
|
|
240
242
|
Name => 'WB_RBLevelsFlash',
|
|
241
|
-
Condition => '$$self{Model} eq "DSLR-A100"',
|
|
243
|
+
Condition => '$$self{Model} eq "DSLR-A100" or $$self{MinoltaPRD}',
|
|
242
244
|
Format => 'int16u[2]',
|
|
243
245
|
},
|
|
244
246
|
28 => { #3
|
|
245
|
-
Name => '
|
|
246
|
-
Condition => '$$self{Model} eq "DSLR-A100"',
|
|
247
|
+
Name => 'WB_RBLevelsCustom', #IB
|
|
248
|
+
Condition => '$$self{Model} eq "DSLR-A100" or $$self{MinoltaPRD}',
|
|
247
249
|
Format => 'int16u[2]',
|
|
248
|
-
Unknown => 1,
|
|
249
250
|
},
|
|
250
251
|
32 => { #3
|
|
251
252
|
Name => 'WB_RBLevelsShade',
|