exiftool_vendored 12.41.0 → 12.50.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 +209 -6
- data/bin/MANIFEST +12 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +45 -44
- data/bin/config_files/acdsee.config +2 -1
- data/bin/config_files/frameCount.config +56 -0
- data/bin/config_files/tiff_version.config +1 -1
- data/bin/exiftool +115 -96
- data/bin/fmt_files/gpx.fmt +3 -0
- data/bin/fmt_files/gpx_wpt.fmt +3 -0
- data/bin/lib/Image/ExifTool/Apple.pm +16 -3
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +23 -12
- data/bin/lib/Image/ExifTool/Canon.pm +71 -33
- data/bin/lib/Image/ExifTool/CanonRaw.pm +8 -1
- data/bin/lib/Image/ExifTool/CanonVRD.pm +7 -8
- data/bin/lib/Image/ExifTool/DJI.pm +60 -1
- data/bin/lib/Image/ExifTool/DNG.pm +8 -2
- data/bin/lib/Image/ExifTool/DarwinCore.pm +13 -1
- data/bin/lib/Image/ExifTool/EXE.pm +9 -1
- data/bin/lib/Image/ExifTool/Exif.pm +26 -12
- data/bin/lib/Image/ExifTool/FLAC.pm +17 -3
- data/bin/lib/Image/ExifTool/FLIR.pm +4 -3
- data/bin/lib/Image/ExifTool/FlashPix.pm +26 -3
- data/bin/lib/Image/ExifTool/FujiFilm.pm +51 -4
- data/bin/lib/Image/ExifTool/GPS.pm +21 -1
- data/bin/lib/Image/ExifTool/Geotag.pm +25 -5
- data/bin/lib/Image/ExifTool/ICC_Profile.pm +12 -9
- data/bin/lib/Image/ExifTool/ICO.pm +143 -0
- data/bin/lib/Image/ExifTool/ID3.pm +11 -11
- data/bin/lib/Image/ExifTool/IPTC.pm +5 -1
- data/bin/lib/Image/ExifTool/LNK.pm +5 -2
- data/bin/lib/Image/ExifTool/M2TS.pm +98 -8
- data/bin/lib/Image/ExifTool/MIE.pm +9 -3
- data/bin/lib/Image/ExifTool/MISB.pm +494 -0
- data/bin/lib/Image/ExifTool/MakerNotes.pm +8 -1
- data/bin/lib/Image/ExifTool/Matroska.pm +24 -16
- data/bin/lib/Image/ExifTool/Motorola.pm +8 -2
- data/bin/lib/Image/ExifTool/Nikon.pm +293 -122
- data/bin/lib/Image/ExifTool/NikonCustom.pm +4 -1
- data/bin/lib/Image/ExifTool/NikonSettings.pm +5 -3
- data/bin/lib/Image/ExifTool/Olympus.pm +22 -2
- data/bin/lib/Image/ExifTool/PDF.pm +2 -1
- data/bin/lib/Image/ExifTool/Panasonic.pm +30 -4
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +25 -5
- data/bin/lib/Image/ExifTool/Parrot.pm +96 -2
- data/bin/lib/Image/ExifTool/Pentax.pm +8 -3
- data/bin/lib/Image/ExifTool/Photoshop.pm +35 -8
- data/bin/lib/Image/ExifTool/QuickTime.pm +163 -13
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +119 -13
- data/bin/lib/Image/ExifTool/README +13 -3
- data/bin/lib/Image/ExifTool/RIFF.pm +106 -9
- data/bin/lib/Image/ExifTool/Samsung.pm +234 -3
- data/bin/lib/Image/ExifTool/Shortcuts.pm +2 -1
- data/bin/lib/Image/ExifTool/Sigma.pm +27 -1
- data/bin/lib/Image/ExifTool/SigmaRaw.pm +37 -13
- data/bin/lib/Image/ExifTool/Sony.pm +71 -43
- data/bin/lib/Image/ExifTool/TagInfoXML.pm +3 -1
- data/bin/lib/Image/ExifTool/TagLookup.pm +4752 -4516
- data/bin/lib/Image/ExifTool/TagNames.pod +1885 -1434
- data/bin/lib/Image/ExifTool/Text.pm +3 -4
- data/bin/lib/Image/ExifTool/Torrent.pm +2 -3
- data/bin/lib/Image/ExifTool/Validate.pm +3 -3
- data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +7 -0
- data/bin/lib/Image/ExifTool/WriteExif.pl +100 -23
- data/bin/lib/Image/ExifTool/WriteIPTC.pl +2 -6
- data/bin/lib/Image/ExifTool/WritePhotoshop.pl +5 -5
- data/bin/lib/Image/ExifTool/WriteRIFF.pl +359 -0
- data/bin/lib/Image/ExifTool/Writer.pl +14 -6
- data/bin/lib/Image/ExifTool/XMP.pm +78 -59
- data/bin/lib/Image/ExifTool/XMP2.pl +19 -4
- data/bin/lib/Image/ExifTool.pm +120 -33
- data/bin/lib/Image/ExifTool.pod +83 -69
- data/bin/perl-Image-ExifTool.spec +43 -43
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +9 -4
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
|
|
88
88
|
sub ProcessExifInfo($$$);
|
89
89
|
sub SwapWords($);
|
90
90
|
|
91
|
-
$VERSION = '4.
|
91
|
+
$VERSION = '4.63';
|
92
92
|
|
93
93
|
# Note: Removed 'USM' from 'L' lenses since it is redundant - PH
|
94
94
|
# (or is it? Ref 32 shows 5 non-USM L-type lenses)
|
@@ -197,6 +197,7 @@ $VERSION = '4.57';
|
|
197
197
|
44 => 'Canon EF 90-300mm f/4.5-5.6', #32
|
198
198
|
45 => 'Canon EF-S 18-55mm f/3.5-5.6 [II]', #PH (same ID for version II, ref 20)
|
199
199
|
46 => 'Canon EF 28-90mm f/4-5.6', #32
|
200
|
+
# 46 => 'Tamron 28-300mm f/3.5-6.3 Di VC PZD (A010)', # (also possibly?)
|
200
201
|
47 => 'Zeiss Milvus 35mm f/2 or 50mm f/2', #IB
|
201
202
|
47.1 => 'Zeiss Milvus 50mm f/2 Makro', #IB
|
202
203
|
47.2 => 'Zeiss Milvus 135mm f/2 ZE', #IB
|
@@ -479,6 +480,7 @@ $VERSION = '4.57';
|
|
479
480
|
255 => 'Sigma 24-105mm f/4 DG OS HSM | A or Other Lens', #50
|
480
481
|
255.1 => 'Sigma 180mm f/2.8 EX DG OS HSM APO Macro', #50
|
481
482
|
255.2 => 'Tamron SP 70-200mm f/2.8 Di VC USD', #exiv issue 1202 (A009)
|
483
|
+
255.3 => 'Yongnuo YN 50mm f/1.8', #50
|
482
484
|
368 => 'Sigma 14-24mm f/2.8 DG HSM | A or other Sigma Lens', #IB (A018)
|
483
485
|
368.1 => 'Sigma 20mm f/1.4 DG HSM | A', #50 (newer firmware)
|
484
486
|
368.2 => 'Sigma 50mm f/1.4 DG HSM | A', #50
|
@@ -492,6 +494,7 @@ $VERSION = '4.57';
|
|
492
494
|
'368.10' => 'Sigma 35mm f/1.4 DG HSM | A', #PH (012)
|
493
495
|
'368.11' => 'Sigma 70mm f/2.8 DG Macro', #IB (A018)
|
494
496
|
'368.12' => 'Sigma 18-35mm f/1.8 DC HSM | A', #50
|
497
|
+
'368.13' => 'Sigma 24-105mm f/4 DG OS HSM | A', #forum3833
|
495
498
|
# Note: LensType 488 (0x1e8) is reported as 232 (0xe8) in 7D CameraSettings
|
496
499
|
488 => 'Canon EF-S 15-85mm f/3.5-5.6 IS USM', #PH
|
497
500
|
489 => 'Canon EF 70-300mm f/4-5.6L IS USM', #Gerald Kapounek
|
@@ -571,7 +574,9 @@ $VERSION = '4.57';
|
|
571
574
|
61494 => 'Canon CN-E 85mm T1.3 L F', #PH
|
572
575
|
61495 => 'Canon CN-E 135mm T2.2 L F', #PH
|
573
576
|
61496 => 'Canon CN-E 35mm T1.5 L F', #PH
|
574
|
-
|
577
|
+
#
|
578
|
+
# see RFLensType tag for master list of 61182 RF lenses
|
579
|
+
#
|
575
580
|
61182 => 'Canon RF 50mm F1.2L USM or other Canon RF Lens',
|
576
581
|
61182.1 => 'Canon RF 24-105mm F4L IS USM',
|
577
582
|
61182.2 => 'Canon RF 28-70mm F2L USM',
|
@@ -594,16 +599,30 @@ $VERSION = '4.57';
|
|
594
599
|
'61182.19' => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF1.4x',
|
595
600
|
'61182.20' => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF2x',
|
596
601
|
'61182.21' => 'Canon RF 70-200mm F4L IS USM', #42
|
597
|
-
'61182.22' => 'Canon RF
|
598
|
-
'61182.23' => 'Canon RF
|
599
|
-
'61182.24' => 'Canon RF
|
600
|
-
'61182.25' => 'Canon RF
|
601
|
-
'61182.26' => 'Canon RF 100-400mm F5.6-8 IS USM
|
602
|
-
'61182.27' => 'Canon RF
|
603
|
-
'61182.28' => 'Canon RF 400mm
|
604
|
-
'61182.29' => 'Canon RF
|
605
|
-
'61182.30' => 'Canon RF
|
606
|
-
|
602
|
+
'61182.22' => 'Canon RF 100mm F2.8L MACRO IS USM', #42
|
603
|
+
'61182.23' => 'Canon RF 50mm F1.8 STM', #42
|
604
|
+
'61182.24' => 'Canon RF 14-35mm F4L IS USM', #IB
|
605
|
+
'61182.25' => 'Canon RF-S 18-45mm F4.5-6.3 IS STM', #42
|
606
|
+
'61182.26' => 'Canon RF 100-400mm F5.6-8 IS USM', #42
|
607
|
+
'61182.27' => 'Canon RF 100-400mm F5.6-8 IS USM + RF1.4x', #42
|
608
|
+
'61182.28' => 'Canon RF 100-400mm F5.6-8 IS USM + RF2x', #42
|
609
|
+
'61182.29' => 'Canon RF-S 18-150mm F3.5-6.3 IS STM', #42
|
610
|
+
'61182.30' => 'Canon RF 24mm F1.8 MACRO IS STM', #42
|
611
|
+
'61182.31' => 'Canon RF 16mm F2.8 STM', #42
|
612
|
+
'61182.32' => 'Canon RF 400mm F2.8L IS USM', #IB
|
613
|
+
'61182.33' => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB
|
614
|
+
'61182.34' => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB
|
615
|
+
'61182.35' => 'Canon RF 600mm F4L IS USM', #GiaZopatti
|
616
|
+
'61182.36' => 'Canon RF 15-30mm F4.5-6.3 IS STM', #42
|
617
|
+
'61182.37' => 'Canon RF 800mm F5.6L IS USM', #42
|
618
|
+
'61182.38' => 'Canon RF 800mm F5.6L IS USM + RF1.4x', #42
|
619
|
+
'61182.39' => 'Canon RF 800mm F5.6L IS USM + RF2x', #42
|
620
|
+
'61182.40' => 'Canon RF 1200mm F8L IS USM', #42
|
621
|
+
'61182.41' => 'Canon RF 1200mm F8L IS USM + RF1.4x', #42
|
622
|
+
'61182.42' => 'Canon RF 1200mm F8L IS USM + RF2x', #42
|
623
|
+
'61182.43' => 'Canon RF 135mm F1.8 L IS USM', #42
|
624
|
+
# we need the RFLensType values for the following...
|
625
|
+
'61182.44' => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH (NC)
|
607
626
|
65535 => 'n/a',
|
608
627
|
);
|
609
628
|
|
@@ -960,8 +979,11 @@ $VERSION = '4.57';
|
|
960
979
|
0x80000437 => 'EOS 90D', #IB
|
961
980
|
0x80000450 => 'EOS R3', #42
|
962
981
|
0x80000453 => 'EOS R6', #PH
|
982
|
+
0x80000464 => 'EOS R7', #42
|
983
|
+
0x80000465 => 'EOS R10', #42
|
963
984
|
0x80000467 => 'PowerShot ZOOM',
|
964
985
|
0x80000468 => 'EOS M50 Mark II / Kiss M2', #IB
|
986
|
+
0x80000481 => 'EOS R6 Mark II', #42
|
965
987
|
0x80000520 => 'EOS D2000C', #IB
|
966
988
|
0x80000560 => 'EOS D6000C', #PH (guess)
|
967
989
|
);
|
@@ -1924,7 +1946,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
1924
1946
|
SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData10' },
|
1925
1947
|
},
|
1926
1948
|
{ # (int16u[3973]) - R3 ref IB
|
1927
|
-
Condition => '$count == 3973',
|
1949
|
+
Condition => '$count == 3973 or $count == 3778',
|
1928
1950
|
Name => 'ColorData11',
|
1929
1951
|
SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData11' },
|
1930
1952
|
},
|
@@ -6357,10 +6379,11 @@ my %ciMaxFocal = (
|
|
6357
6379
|
1 => {
|
6358
6380
|
Name => 'TimeZone',
|
6359
6381
|
PrintConv => 'Image::ExifTool::TimeZoneString($val)',
|
6360
|
-
PrintConvInv =>
|
6361
|
-
|
6362
|
-
$val =~
|
6363
|
-
|
6382
|
+
PrintConvInv => q{
|
6383
|
+
$val =~ /Z$/ and return 0;
|
6384
|
+
$val =~ /([-+])(\d{1,2}):?(\d{2})$/ and return $1 . ($2 * 60 + $3);
|
6385
|
+
$val =~ /^(\d{2})(\d{2})$/ and return $1 * 60 + $2;
|
6386
|
+
return undef;
|
6364
6387
|
},
|
6365
6388
|
},
|
6366
6389
|
2 => {
|
@@ -6522,23 +6545,23 @@ my %ciMaxFocal = (
|
|
6522
6545
|
0x02 => 'FacesDetected',
|
6523
6546
|
);
|
6524
6547
|
|
6525
|
-
# G9 white balance information (MakerNotes tag 0x29) (ref IB)
|
6548
|
+
# G9 white balance information (MakerNotes tag 0x29) (ref IB, changed ref forum13640)
|
6526
6549
|
%Image::ExifTool::Canon::WBInfo = (
|
6527
6550
|
%binaryDataAttrs,
|
6528
6551
|
NOTES => 'WB tags for the Canon G9.',
|
6529
6552
|
FORMAT => 'int32u',
|
6530
6553
|
FIRST_ENTRY => 1,
|
6531
6554
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
|
6532
|
-
0x02 => { Name => '
|
6533
|
-
0x0a => { Name => '
|
6534
|
-
0x12 => { Name => '
|
6535
|
-
0x1a => { Name => '
|
6536
|
-
0x22 => { Name => '
|
6537
|
-
0x2a => { Name => '
|
6538
|
-
0x32 => { Name => '
|
6539
|
-
0x3a => { Name => '
|
6540
|
-
0x42 => { Name => '
|
6541
|
-
0x4a => { Name => '
|
6555
|
+
0x02 => { Name => 'WB_GRBGLevelsAuto', Format => 'int32s[4]' },
|
6556
|
+
0x0a => { Name => 'WB_GRBGLevelsDaylight', Format => 'int32s[4]' },
|
6557
|
+
0x12 => { Name => 'WB_GRBGLevelsCloudy', Format => 'int32s[4]' },
|
6558
|
+
0x1a => { Name => 'WB_GRBGLevelsTungsten', Format => 'int32s[4]' },
|
6559
|
+
0x22 => { Name => 'WB_GRBGLevelsFluorescent', Format => 'int32s[4]' },
|
6560
|
+
0x2a => { Name => 'WB_GRBGLevelsFluorHigh', Format => 'int32s[4]' },
|
6561
|
+
0x32 => { Name => 'WB_GRBGLevelsFlash', Format => 'int32s[4]' },
|
6562
|
+
0x3a => { Name => 'WB_GRBGLevelsUnderwater', Format => 'int32s[4]' },
|
6563
|
+
0x42 => { Name => 'WB_GRBGLevelsCustom1', Format => 'int32s[4]' },
|
6564
|
+
0x4a => { Name => 'WB_GRBGLevelsCustom2', Format => 'int32s[4]' },
|
6542
6565
|
);
|
6543
6566
|
|
6544
6567
|
# yet more face detect information (MakerNotes tag 0x2f) - PH (G12)
|
@@ -6795,16 +6818,28 @@ my %ciMaxFocal = (
|
|
6795
6818
|
276 => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF1.4x',
|
6796
6819
|
277 => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF2x',
|
6797
6820
|
278 => 'Canon RF 70-200mm F4L IS USM', #42
|
6821
|
+
279 => 'Canon RF 100mm F2.8L MACRO IS USM', #42
|
6798
6822
|
280 => 'Canon RF 50mm F1.8 STM', #42
|
6799
6823
|
281 => 'Canon RF 14-35mm F4L IS USM', #42/IB
|
6824
|
+
282 => 'Canon RF-S 18-45mm F4.5-6.3 IS STM', #42
|
6800
6825
|
283 => 'Canon RF 100-400mm F5.6-8 IS USM', #42
|
6801
|
-
284 => 'Canon RF 100-400mm F5.6-8 IS USM + RF1.4x', #42
|
6802
|
-
285 => 'Canon RF 100-400mm F5.6-8 IS USM + RF2x', #42
|
6826
|
+
284 => 'Canon RF 100-400mm F5.6-8 IS USM + RF1.4x', #42
|
6827
|
+
285 => 'Canon RF 100-400mm F5.6-8 IS USM + RF2x', #42
|
6828
|
+
286 => 'Canon RF-S 18-150mm F3.5-6.3 IS STM', #42
|
6829
|
+
287 => 'Canon RF 24mm F1.8 MACRO IS STM', #42
|
6803
6830
|
288 => 'Canon RF 16mm F2.8 STM', #42
|
6804
6831
|
289 => 'Canon RF 400mm F2.8L IS USM', #IB
|
6805
6832
|
290 => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB
|
6806
6833
|
291 => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB
|
6807
|
-
|
6834
|
+
292 => 'Canon RF 600mm F4L IS USM', #GiaZopatti
|
6835
|
+
295 => 'Canon RF 800mm F5.6L IS USM', #42
|
6836
|
+
296 => 'Canon RF 800mm F5.6L IS USM + RF1.4x', #42
|
6837
|
+
297 => 'Canon RF 800mm F5.6L IS USM + RF2x', #42
|
6838
|
+
298 => 'Canon RF 1200mm F8L IS USM', #42
|
6839
|
+
299 => 'Canon RF 1200mm F8L IS USM + RF1.4x', #42
|
6840
|
+
300 => 'Canon RF 1200mm F8L IS USM + RF2x', #42
|
6841
|
+
302 => 'Canon RF 15-30mm F4.5-6.3 IS STM', #42
|
6842
|
+
303 => 'Canon RF 135mm F1.8 L IS USM', #42
|
6808
6843
|
# Note: add new RF lenses to %canonLensTypes with ID 61182
|
6809
6844
|
},
|
6810
6845
|
},
|
@@ -6849,6 +6884,7 @@ my %ciMaxFocal = (
|
|
6849
6884
|
8 => '4:5',
|
6850
6885
|
12 => '3:2 (APS-H crop)', #IB
|
6851
6886
|
13 => '3:2 (APS-C crop)', #IB
|
6887
|
+
258 => '4:3 crop', #PH (NC)
|
6852
6888
|
},
|
6853
6889
|
},
|
6854
6890
|
# (could use better names for these, or the Crop tags above, or both)
|
@@ -8301,7 +8337,7 @@ my %ciMaxFocal = (
|
|
8301
8337
|
# Color data (MakerNotes tag 0x4001, count=3973, ref IB)
|
8302
8338
|
%Image::ExifTool::Canon::ColorData11 = (
|
8303
8339
|
%binaryDataAttrs,
|
8304
|
-
NOTES => 'These tags are used by the EOS R3',
|
8340
|
+
NOTES => 'These tags are used by the EOS R3, R7 and R6mkII',
|
8305
8341
|
FORMAT => 'int16s',
|
8306
8342
|
FIRST_ENTRY => 0,
|
8307
8343
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
@@ -8313,6 +8349,7 @@ my %ciMaxFocal = (
|
|
8313
8349
|
RawConv => '$$self{ColorDataVersion} = $val',
|
8314
8350
|
PrintConv => {
|
8315
8351
|
34 => '34 (R3)', #IB
|
8352
|
+
48 => '48 (R7, R10, R6 Mark II)', #IB
|
8316
8353
|
},
|
8317
8354
|
},
|
8318
8355
|
0x69 => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' },
|
@@ -9378,8 +9415,9 @@ my %filterConv = (
|
|
9378
9415
|
# numbers from the previous image, so we need special logic
|
9379
9416
|
# to handle the FileIndex wrap properly)
|
9380
9417
|
$val[1] == 10000 and $val[1] = 1, ++$val[0];
|
9381
|
-
return sprintf("%.3d
|
9418
|
+
return sprintf("%.3d%.4d",@val);
|
9382
9419
|
},
|
9420
|
+
PrintConv => '$_=$val;s/(\d+)(\d{4})/$1-$2/;$_',
|
9383
9421
|
},
|
9384
9422
|
);
|
9385
9423
|
|
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
21
21
|
use Image::ExifTool::Exif;
|
22
22
|
use Image::ExifTool::Canon;
|
23
23
|
|
24
|
-
$VERSION = '1.
|
24
|
+
$VERSION = '1.59';
|
25
25
|
|
26
26
|
sub WriteCRW($$);
|
27
27
|
sub ProcessCanonRaw($$$);
|
@@ -625,6 +625,13 @@ sub ProcessCanonRaw($$$)
|
|
625
625
|
$raf->Seek($blockStart+$blockSize-4, 0) or return 0;
|
626
626
|
$raf->Read($buff, 4) == 4 or return 0;
|
627
627
|
my $dirOffset = Get32u(\$buff,0) + $blockStart;
|
628
|
+
# avoid infinite recursion
|
629
|
+
$$et{ProcessedCanonRaw} or $$et{ProcessedCanonRaw} = { };
|
630
|
+
if ($$et{ProcessedCanonRaw}{$dirOffset}) {
|
631
|
+
$et->Warn("Not processing double-referenced $$dirInfo{DirName} directory");
|
632
|
+
return 0;
|
633
|
+
}
|
634
|
+
$$et{ProcessedCanonRaw}{$dirOffset} = 1;
|
628
635
|
$raf->Seek($dirOffset, 0) or return 0;
|
629
636
|
$raf->Read($buff, 2) == 2 or return 0;
|
630
637
|
my $entries = Get16u(\$buff,0); # get number of entries in directory
|
@@ -23,7 +23,7 @@ use vars qw($VERSION);
|
|
23
23
|
use Image::ExifTool qw(:DataAccess :Utils);
|
24
24
|
use Image::ExifTool::Canon;
|
25
25
|
|
26
|
-
$VERSION = '1.
|
26
|
+
$VERSION = '1.34';
|
27
27
|
|
28
28
|
sub ProcessCanonVRD($$;$);
|
29
29
|
sub WriteCanonVRD($$;$);
|
@@ -2046,17 +2046,16 @@ sub ProcessCanonVRD($$;$)
|
|
2046
2046
|
return 0;
|
2047
2047
|
}
|
2048
2048
|
}
|
2049
|
-
# exit quickly if writing and no CanonVRD tags are being edited
|
2050
|
-
if ($outfile and not exists $$et{EDIT_DIRS}{CanonVRD}) {
|
2051
|
-
print $out "$$et{INDENT} [nothing changed]\n" if $verbose;
|
2052
|
-
return 1 if $outfile eq $dataPt;
|
2053
|
-
return Write($outfile, $$dataPt) ? 1 : -1;
|
2054
|
-
}
|
2055
|
-
|
2056
2049
|
my $vrdType = 'VRD';
|
2057
2050
|
|
2058
2051
|
if ($outfile) {
|
2059
2052
|
$verbose and not $created and print $out " Rewriting CanonVRD trailer\n";
|
2053
|
+
# exit quickly if writing and no CanonVRD tags are being edited
|
2054
|
+
unless (exists $$et{EDIT_DIRS}{CanonVRD}) {
|
2055
|
+
print $out "$$et{INDENT} [nothing changed in CanonVRD]\n" if $verbose;
|
2056
|
+
return 1 if $outfile eq $dataPt;
|
2057
|
+
return Write($outfile, $$dataPt) ? 1 : -1;
|
2058
|
+
}
|
2060
2059
|
# delete CanonVRD information if specified
|
2061
2060
|
my $doDel = $$et{DEL_GROUP}{CanonVRD};
|
2062
2061
|
unless ($doDel) {
|
@@ -11,11 +11,14 @@ package Image::ExifTool::DJI;
|
|
11
11
|
|
12
12
|
use strict;
|
13
13
|
use vars qw($VERSION);
|
14
|
+
use Image::ExifTool qw(:DataAccess :Utils);
|
14
15
|
use Image::ExifTool::Exif;
|
15
16
|
use Image::ExifTool::XMP;
|
16
17
|
use Image::ExifTool::GPS;
|
17
18
|
|
18
|
-
$VERSION = '1.
|
19
|
+
$VERSION = '1.06';
|
20
|
+
|
21
|
+
sub ProcessDJIInfo($$$);
|
19
22
|
|
20
23
|
my %convFloat2 = (
|
21
24
|
PrintConv => 'sprintf("%+.2f", $val)',
|
@@ -44,6 +47,29 @@ my %convFloat2 = (
|
|
44
47
|
0x0b => { Name => 'CameraRoll', Writable => 'float', %convFloat2 },
|
45
48
|
);
|
46
49
|
|
50
|
+
# DJI debug maker notes
|
51
|
+
%Image::ExifTool::DJI::Info = (
|
52
|
+
PROCESS_PROC => \&ProcessDJIInfo,
|
53
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
54
|
+
NOTES => 'Tags written by some DJI drones.',
|
55
|
+
VARS => { LONG_TAGS => 2 },
|
56
|
+
ae_dbg_info => { Name => 'AEDebugInfo' },
|
57
|
+
ae_histogram_info => { Name => 'AEHistogramInfo' },
|
58
|
+
ae_local_histogram => { Name => 'AELocalHistogram' },
|
59
|
+
ae_liveview_histogram_info => { Name => 'AELiveViewHistogramInfo' },
|
60
|
+
ae_liveview_local_histogram => { Name => 'AELiveViewLocalHistogram' },
|
61
|
+
awb_dbg_info => { Name => 'AWBDebugInfo' },
|
62
|
+
af_dbg_info => { Name => 'AFDebugInfo' },
|
63
|
+
hiso => { Name => 'Histogram' },
|
64
|
+
xidiri => { Name => 'Xidiri' },
|
65
|
+
'GimbalDegree(Y,P,R)'=> { Name => 'GimbalDegree' },
|
66
|
+
'FlightDegree(Y,P,R)'=> { Name => 'FlightDegree' },
|
67
|
+
adj_dbg_info => { Name => 'ADJDebugInfo' },
|
68
|
+
sensor_id => { Name => 'SensorID' },
|
69
|
+
'FlightSpeed(X,Y,Z)' => { Name => 'FlightSpeed' },
|
70
|
+
hyperlapse_dbg_info => { Name => 'HyperlapsDebugInfo' },
|
71
|
+
);
|
72
|
+
|
47
73
|
# thermal parameters in APP4 of DJI ZH20T images (ref forum11401)
|
48
74
|
%Image::ExifTool::DJI::ThermalParams = (
|
49
75
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
@@ -134,6 +160,39 @@ my %convFloat2 = (
|
|
134
160
|
},
|
135
161
|
);
|
136
162
|
|
163
|
+
#------------------------------------------------------------------------------
|
164
|
+
# Process DJI infor (ref PH)
|
165
|
+
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
166
|
+
# Returns: 1 on success
|
167
|
+
sub ProcessDJIInfo($$$)
|
168
|
+
{
|
169
|
+
my ($et, $dirInfo, $tagTbl) = @_;
|
170
|
+
my $dataPt = $$dirInfo{DataPt};
|
171
|
+
my $dirStart = $$dirInfo{DirStart} || 0;
|
172
|
+
my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart);
|
173
|
+
if ($dirStart) {
|
174
|
+
my $buff = substr($$dataPt, $dirStart, $dirLen);
|
175
|
+
$dataPt = \$buff;
|
176
|
+
}
|
177
|
+
while ($$dataPt =~ /\G\[(.*?)\](?=(\[|$))/sg) {
|
178
|
+
my ($tag, $val) = split /:/, $1, 2;
|
179
|
+
next unless defined $tag and defined $val;
|
180
|
+
if ($val =~ /^([\x20-\x7f]+)\0*$/) {
|
181
|
+
$val = $1;
|
182
|
+
} else {
|
183
|
+
my $buff = $val;
|
184
|
+
$val = \$buff;
|
185
|
+
}
|
186
|
+
if (not $$tagTbl{$tag} and $tag=~ /^[-_a-zA-Z0-9]+$/) {
|
187
|
+
my $name = $tag;
|
188
|
+
$name =~ s/_([a-z])/_\U$1/g;
|
189
|
+
AddTagToTable($tagTbl, $tag, { Name => Image::ExifTool::MakeTagName($name) });
|
190
|
+
}
|
191
|
+
$et->HandleTag($tagTbl, $tag, $val);
|
192
|
+
}
|
193
|
+
return 1;
|
194
|
+
}
|
195
|
+
|
137
196
|
__END__
|
138
197
|
|
139
198
|
=head1 NAME
|
@@ -680,8 +680,14 @@ sub ProcessAdobeMakN($$$)
|
|
680
680
|
my $dataPos = $$dirInfo{DataPos};
|
681
681
|
my $hdrLen = 6;
|
682
682
|
|
683
|
-
# hack for extra 12 bytes in MakN header of JPEG converted to DNG
|
684
|
-
# (4 bytes "00 00 00 01" followed by 8 unknown bytes)
|
683
|
+
# 2018-09-27: hack for extra 12 bytes in MakN header of JPEG converted to DNG
|
684
|
+
# by Adobe Camera Raw (4 bytes "00 00 00 01" followed by 8 unknown bytes)
|
685
|
+
# - this is because CameraRaw copies the maker notes from the wrong location
|
686
|
+
# in a JPG image (off by 12 bytes presumably due to the JPEG headers)
|
687
|
+
# - this hack won't work in most cases because the extra bytes are not consistent
|
688
|
+
# since they are just the data that existed in the JPG before the maker notes
|
689
|
+
# - also, the last 12 bytes of the maker notes will be missing
|
690
|
+
# - 2022-04-26: this bug still exists in Camera Raw 14.3
|
685
691
|
$hdrLen += 12 if $len >= 18 and substr($$dataPt, $start+6, 4) eq "\0\0\0\x01";
|
686
692
|
|
687
693
|
my $dirStart = $start + $hdrLen; # pointer to maker note directory
|
@@ -15,7 +15,7 @@ use strict;
|
|
15
15
|
use vars qw($VERSION);
|
16
16
|
use Image::ExifTool::XMP;
|
17
17
|
|
18
|
-
$VERSION = '1.
|
18
|
+
$VERSION = '1.07';
|
19
19
|
|
20
20
|
my %dateTimeInfo = (
|
21
21
|
# NOTE: Do NOT put "Groups" here because Groups hash must not be common!
|
@@ -138,6 +138,9 @@ my %event = (
|
|
138
138
|
identificationVerificationStatus => { },
|
139
139
|
identifiedBy => { },
|
140
140
|
typeStatus => { },
|
141
|
+
# new, ref forum13707
|
142
|
+
identifiedByID => { },
|
143
|
+
verbatimIdentification => { },
|
141
144
|
},
|
142
145
|
},
|
143
146
|
LivingSpecimen => { Struct => \%materialSample },
|
@@ -189,6 +192,11 @@ my %event = (
|
|
189
192
|
recordNumber => { },
|
190
193
|
reproductiveCondition => { },
|
191
194
|
sex => { },
|
195
|
+
# new, ref forum13707
|
196
|
+
degreeOfEstablishment => { },
|
197
|
+
georeferenceVerificationStatus => { },
|
198
|
+
pathway => { },
|
199
|
+
recordedByID => { },
|
192
200
|
},
|
193
201
|
},
|
194
202
|
OccurrenceOccurrenceDetails => { Name => 'OccurrenceDetails', Flat => 1 },
|
@@ -242,6 +250,7 @@ my %event = (
|
|
242
250
|
relationshipRemarks => { },
|
243
251
|
resourceID => { },
|
244
252
|
resourceRelationshipID => { },
|
253
|
+
relationshipOfResourceID => { }, # new, ref forum13707
|
245
254
|
},
|
246
255
|
},
|
247
256
|
Taxon => {
|
@@ -255,6 +264,7 @@ my %event = (
|
|
255
264
|
genus => { },
|
256
265
|
higherClassification => { },
|
257
266
|
infraspecificEpithet => { },
|
267
|
+
cultivarEpithet => { }, # new, ref forum13707
|
258
268
|
kingdom => { },
|
259
269
|
nameAccordingTo => { },
|
260
270
|
nameAccordingToID => { },
|
@@ -338,6 +348,8 @@ my %event = (
|
|
338
348
|
verbatimLongitude => { },
|
339
349
|
verbatimSRS => { },
|
340
350
|
waterBody => { },
|
351
|
+
# new, ref forum13707
|
352
|
+
verticalDatum => { },
|
341
353
|
},
|
342
354
|
},
|
343
355
|
);
|
@@ -21,7 +21,7 @@ use strict;
|
|
21
21
|
use vars qw($VERSION);
|
22
22
|
use Image::ExifTool qw(:DataAccess :Utils);
|
23
23
|
|
24
|
-
$VERSION = '1.
|
24
|
+
$VERSION = '1.18';
|
25
25
|
|
26
26
|
sub ProcessPEResources($$);
|
27
27
|
sub ProcessPEVersion($$);
|
@@ -1233,6 +1233,14 @@ sub ProcessEXE($$)
|
|
1233
1233
|
$tagTablePtr = GetTagTable('Image::ExifTool::EXE::MachO');
|
1234
1234
|
if ($1 eq "\xca\xfe\xba\xbe") {
|
1235
1235
|
SetByteOrder('MM');
|
1236
|
+
my $ver = Get32u(\$buff, 4);
|
1237
|
+
# Java bytecode .class files have the same magic number, so we need to look deeper
|
1238
|
+
# (ref https://github.com/file/file/blob/master/magic/Magdir/cafebabe#L6-L15)
|
1239
|
+
if ($ver > 30) {
|
1240
|
+
# this is Java bytecode
|
1241
|
+
$et->SetFileType('Java bytecode', 'application/java-byte-code', 'class');
|
1242
|
+
return 1;
|
1243
|
+
}
|
1236
1244
|
$et->SetFileType('Mach-O fat binary executable', undef, '');
|
1237
1245
|
return 1 if $fast3;
|
1238
1246
|
my $count = Get32u(\$buff, 4); # get architecture count
|
@@ -56,7 +56,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
|
|
56
56
|
use Image::ExifTool qw(:DataAccess :Utils);
|
57
57
|
use Image::ExifTool::MakerNotes;
|
58
58
|
|
59
|
-
$VERSION = '4.
|
59
|
+
$VERSION = '4.42';
|
60
60
|
|
61
61
|
sub ProcessExif($$$);
|
62
62
|
sub WriteExif($$$);
|
@@ -1084,11 +1084,11 @@ my %opcodeInfo = (
|
|
1084
1084
|
{
|
1085
1085
|
Name => 'ThumbnailOffset',
|
1086
1086
|
Notes => q{
|
1087
|
-
|
1088
|
-
|
1089
|
-
|
1090
|
-
|
1091
|
-
OtherImageStart in everything else
|
1087
|
+
called JPEGInterchangeFormat in the specification, this is ThumbnailOffset
|
1088
|
+
in IFD1 of JPEG and some TIFF-based images, IFD0 of MRW images and AVI and
|
1089
|
+
MOV videos, and the SubIFD in IFD1 of SRW images; PreviewImageStart in
|
1090
|
+
MakerNotes and IFD0 of ARW and SR2 images; JpgFromRawStart in SubIFD of NEF
|
1091
|
+
images and IFD2 of PEF images; and OtherImageStart in everything else
|
1092
1092
|
},
|
1093
1093
|
# thumbnail is found in IFD1 of JPEG and TIFF images, and
|
1094
1094
|
# IFD0 of EXIF information in FujiFilm AVI (RIFF) and MOV videos
|
@@ -1225,6 +1225,7 @@ my %opcodeInfo = (
|
|
1225
1225
|
{
|
1226
1226
|
Name => 'ThumbnailLength',
|
1227
1227
|
Notes => q{
|
1228
|
+
called JPEGInterchangeFormatLength in the specification, this is
|
1228
1229
|
ThumbnailLength in IFD1 of JPEG and some TIFF-based images, IFD0 of MRW
|
1229
1230
|
images and AVI and MOV videos, and the SubIFD in IFD1 of SRW images;
|
1230
1231
|
PreviewImageLength in MakerNotes and IFD0 of ARW and SR2 images;
|
@@ -2080,6 +2081,7 @@ my %opcodeInfo = (
|
|
2080
2081
|
Groups => { 2 => 'Time' },
|
2081
2082
|
Notes => 'time zone for ModifyDate',
|
2082
2083
|
Writable => 'string',
|
2084
|
+
Shift => 'Time',
|
2083
2085
|
PrintConvInv => q{
|
2084
2086
|
return "+00:00" if $val =~ /\d{2}Z$/;
|
2085
2087
|
return sprintf("%s%.2d:%.2d",$1,$2,$3) if $val =~ /([-+])(\d{1,2}):(\d{2})/;
|
@@ -2091,6 +2093,7 @@ my %opcodeInfo = (
|
|
2091
2093
|
Groups => { 2 => 'Time' },
|
2092
2094
|
Notes => 'time zone for DateTimeOriginal',
|
2093
2095
|
Writable => 'string',
|
2096
|
+
Shift => 'Time',
|
2094
2097
|
PrintConvInv => q{
|
2095
2098
|
return "+00:00" if $val =~ /\d{2}Z$/;
|
2096
2099
|
return sprintf("%s%.2d:%.2d",$1,$2,$3) if $val =~ /([-+])(\d{1,2}):(\d{2})/;
|
@@ -2102,6 +2105,7 @@ my %opcodeInfo = (
|
|
2102
2105
|
Groups => { 2 => 'Time' },
|
2103
2106
|
Notes => 'time zone for CreateDate',
|
2104
2107
|
Writable => 'string',
|
2108
|
+
Shift => 'Time',
|
2105
2109
|
PrintConvInv => q{
|
2106
2110
|
return "+00:00" if $val =~ /\d{2}Z$/;
|
2107
2111
|
return sprintf("%s%.2d:%.2d",$1,$2,$3) if $val =~ /([-+])(\d{1,2}):(\d{2})/;
|
@@ -3397,6 +3401,15 @@ my %opcodeInfo = (
|
|
3397
3401
|
},
|
3398
3402
|
# the DJI FC2103 writes some interesting stuff here (with sections labelled
|
3399
3403
|
# awb_dbg_info, ae_dbg_info, ae_histogram_info, af_dbg_info, hiso, xidiri) - PH
|
3404
|
+
{
|
3405
|
+
Name => 'MakerNoteDJIInfo',
|
3406
|
+
Condition => '$$valPt =~ /^\[ae_dbg_info:/',
|
3407
|
+
MakerNotes => 1,
|
3408
|
+
Binary => 1,
|
3409
|
+
WriteGroup => 'IFD0', # (for Validate)
|
3410
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::Info' },
|
3411
|
+
Format => 'undef',
|
3412
|
+
},
|
3400
3413
|
{
|
3401
3414
|
Name => 'DNGPrivateData',
|
3402
3415
|
Flags => [ 'Binary', 'Protected' ],
|
@@ -4071,7 +4084,7 @@ my %opcodeInfo = (
|
|
4071
4084
|
WriteGroup => 'SubIFD' #? (NC) Semantic Mask IFD (only for Validate)
|
4072
4085
|
},
|
4073
4086
|
0xcd30 => { # DNG 1.6
|
4074
|
-
Name => '
|
4087
|
+
Name => 'SemanticInstanceID',
|
4075
4088
|
# Writable => 'string',
|
4076
4089
|
WriteGroup => 'SubIFD' #? (NC) Semantic Mask IFD (only for Validate)
|
4077
4090
|
},
|
@@ -4833,10 +4846,10 @@ my %subSecConv = (
|
|
4833
4846
|
Writable => 1,
|
4834
4847
|
Protected => 1,
|
4835
4848
|
WriteAlso => {
|
4836
|
-
GPSLatitude => '$val =~ /(.*?)( ?[NS])?,/ ? $1 : undef',
|
4837
|
-
GPSLatitudeRef => '$val =~ /(-?)(.*?) ?([NS]?),/ ? ($3 || ($1 ? "S" : "N")) : undef',
|
4838
|
-
GPSLongitude => '$val =~ /, ?(.*?)( ?[EW]?)$/ ? $1 : undef',
|
4839
|
-
GPSLongitudeRef => '$val =~ /, ?(-?)(.*?) ?([EW]?)$/ ? ($3 || ($1 ? "W" : "E")) : undef',
|
4849
|
+
GPSLatitude => '(defined $val and $val =~ /(.*?)( ?[NS])?,/) ? $1 : undef',
|
4850
|
+
GPSLatitudeRef => '(defined $val and $val =~ /(-?)(.*?) ?([NS]?),/) ? ($3 || ($1 ? "S" : "N")) : undef',
|
4851
|
+
GPSLongitude => '(defined $val and $val =~ /, ?(.*?)( ?[EW]?)$/) ? $1 : undef',
|
4852
|
+
GPSLongitudeRef => '(defined $val and $val =~ /, ?(-?)(.*?) ?([EW]?)$/) ? ($3 || ($1 ? "W" : "E")) : undef',
|
4840
4853
|
},
|
4841
4854
|
PrintConvInv => q{
|
4842
4855
|
return undef unless $val =~ /(.*? ?[NS]?), ?(.*? ?[EW]?)$/;
|
@@ -6003,7 +6016,8 @@ sub ProcessExif($$$)
|
|
6003
6016
|
my $tagID = Get16u($dataPt, $entry);
|
6004
6017
|
my $format = Get16u($dataPt, $entry+2);
|
6005
6018
|
my $count = Get32u($dataPt, $entry+4);
|
6006
|
-
|
6019
|
+
# (Apple uses the BigTIFF format code 16 in the maker notes of their ProRaw DNG files)
|
6020
|
+
if (($format < 1 or $format > 13) and not ($format == 16 and $$et{Make} eq 'Apple' and $inMakerNotes)) {
|
6007
6021
|
if ($mapFmt and $$mapFmt{$format}) {
|
6008
6022
|
$format = $$mapFmt{$format};
|
6009
6023
|
} else {
|
@@ -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.09';
|
18
18
|
|
19
19
|
sub ProcessBitStream($$$);
|
20
20
|
|
@@ -29,7 +29,19 @@ sub ProcessBitStream($$$);
|
|
29
29
|
SubDirectory => { TagTable => 'Image::ExifTool::FLAC::StreamInfo' },
|
30
30
|
},
|
31
31
|
1 => { Name => 'Padding', Binary => 1, Unknown => 1 },
|
32
|
-
2 => {
|
32
|
+
2 => [{ # (see forum14064)
|
33
|
+
Name => 'Application_riff',
|
34
|
+
Condition => '$$valPt =~ /^riff(?!RIFF)/', # (all "riff" blocks but header)
|
35
|
+
SubDirectory => {
|
36
|
+
TagTable => 'Image::ExifTool::RIFF::Main',
|
37
|
+
ByteOrder => 'LittleEndian',
|
38
|
+
Start => 4,
|
39
|
+
},
|
40
|
+
},{
|
41
|
+
Name => 'ApplicationUnknown',
|
42
|
+
Binary => 1,
|
43
|
+
Unknown => 1,
|
44
|
+
}],
|
33
45
|
3 => { Name => 'SeekTable', Binary => 1, Unknown => 1 },
|
34
46
|
4 => {
|
35
47
|
Name => 'VorbisComment',
|
@@ -255,9 +267,11 @@ sub ProcessFLAC($$)
|
|
255
267
|
print $out "FLAC metadata block, type $tag:\n";
|
256
268
|
$et->VerboseDump(\$buff, DataPos => $raf->Tell() - $size);
|
257
269
|
}
|
258
|
-
$et->HandleTag($tagTablePtr, $tag,
|
270
|
+
$et->HandleTag($tagTablePtr, $tag, $buff,
|
259
271
|
DataPt => \$buff,
|
260
272
|
DataPos => $raf->Tell() - $size,
|
273
|
+
Start => 0,
|
274
|
+
Size => $size,
|
261
275
|
);
|
262
276
|
last if $last; # all done if is set
|
263
277
|
}
|
@@ -24,7 +24,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
24
24
|
use Image::ExifTool::Exif;
|
25
25
|
use Image::ExifTool::GPS;
|
26
26
|
|
27
|
-
$VERSION = '1.
|
27
|
+
$VERSION = '1.21';
|
28
28
|
|
29
29
|
sub ProcessFLIR($$;$);
|
30
30
|
sub ProcessFLIRText($$$);
|
@@ -99,7 +99,8 @@ my %float8g = ( Format => 'float', PrintConv => 'sprintf("%.8g",$val)' );
|
|
99
99
|
NOTES => q{
|
100
100
|
Information extracted from FLIR FFF images and the APP1 FLIR segment of JPEG
|
101
101
|
images. These tags may also be extracted from the first frame of an FLIR
|
102
|
-
SEQ file, or all frames if the ExtractEmbedded option is used.
|
102
|
+
SEQ file, or all frames if the ExtractEmbedded option is used. Setting
|
103
|
+
ExtractEmbedded to 2 also the raw thermal data from all frames.
|
103
104
|
},
|
104
105
|
"_header" => {
|
105
106
|
Name => 'FFFHeader',
|
@@ -1551,7 +1552,7 @@ sub ProcessFLIR($$;$)
|
|
1551
1552
|
$$et{INDENT}, $i, $recType, $recPos, $recLen;
|
1552
1553
|
|
1553
1554
|
# skip RawData records for embedded documents
|
1554
|
-
if ($recType == 1 and $$et{DOC_NUM}) {
|
1555
|
+
if ($recType == 1 and $$et{DOC_NUM} and $et->Options('ExtractEmbedded') < 2) {
|
1555
1556
|
$raf->Seek($base+$recPos+$recLen) or $success = 0, last;
|
1556
1557
|
next;
|
1557
1558
|
}
|