exiftool_vendored 13.12.0 → 13.16.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 +79 -22
- data/bin/MANIFEST +7 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/arg_files/exif2xmp.args +4 -0
- data/bin/arg_files/xmp2exif.args +2 -1
- data/bin/build_geolocation +1 -1
- data/bin/exiftool +6 -5
- data/bin/lib/Image/ExifTool/AFCP.pm +5 -5
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +20 -15
- data/bin/lib/Image/ExifTool/Canon.pm +5 -3
- data/bin/lib/Image/ExifTool/DJI.pm +64 -11
- data/bin/lib/Image/ExifTool/EXE.pm +17 -3
- data/bin/lib/Image/ExifTool/Geolocation.pm +16 -7
- data/bin/lib/Image/ExifTool/ID3.pm +4 -4
- data/bin/lib/Image/ExifTool/JPEG.pm +5 -1
- data/bin/lib/Image/ExifTool/LigoGPS.pm +1 -0
- data/bin/lib/Image/ExifTool/MIE.pm +6 -3
- data/bin/lib/Image/ExifTool/Nikon.pm +328 -4
- data/bin/lib/Image/ExifTool/NikonCustom.pm +1 -1
- data/bin/lib/Image/ExifTool/Panasonic.pm +7 -1
- data/bin/lib/Image/ExifTool/Protobuf.pm +25 -7
- data/bin/lib/Image/ExifTool/QuickTime.pm +215 -59
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +12 -12
- data/bin/lib/Image/ExifTool/README +4 -1
- data/bin/lib/Image/ExifTool/RIFF.pm +11 -1
- data/bin/lib/Image/ExifTool/Samsung.pm +1 -1
- data/bin/lib/Image/ExifTool/TagLookup.pm +4821 -4811
- data/bin/lib/Image/ExifTool/TagNames.pod +231 -25
- data/bin/lib/Image/ExifTool/Torrent.pm +2 -2
- data/bin/lib/Image/ExifTool/Vivo.pm +124 -0
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +114 -63
- data/bin/lib/Image/ExifTool/WriteRIFF.pl +3 -1
- data/bin/lib/Image/ExifTool/Writer.pl +16 -11
- data/bin/lib/Image/ExifTool.pm +24 -8
- data/bin/lib/Image/ExifTool.pod +52 -49
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +3 -2
@@ -18,14 +18,15 @@ use Image::ExifTool::XMP;
|
|
18
18
|
use Image::ExifTool::GPS;
|
19
19
|
use Image::ExifTool::Protobuf;
|
20
20
|
|
21
|
-
$VERSION = '1.
|
21
|
+
$VERSION = '1.12';
|
22
22
|
|
23
23
|
sub ProcessDJIInfo($$$);
|
24
24
|
|
25
25
|
%knownProtocol = (
|
26
|
-
'dvtm_ac203.proto' => 1,
|
27
|
-
'dvtm_ac204.proto' => 1,
|
28
|
-
'dvtm_AVATA2.proto' => 1,
|
26
|
+
'dvtm_ac203.proto' => 1, # Osmo Action 4
|
27
|
+
'dvtm_ac204.proto' => 1, # Osmo Action 5
|
28
|
+
'dvtm_AVATA2.proto' => 1, # Avanta 2
|
29
|
+
'dvtm_wm265e.proto' => 1, # Mavic 3
|
29
30
|
);
|
30
31
|
|
31
32
|
my %convFloat2 = (
|
@@ -200,15 +201,19 @@ my %convFloat2 = (
|
|
200
201
|
TAG_PREFIX => '',
|
201
202
|
PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
|
202
203
|
NOTES => q{
|
203
|
-
Tags found in protobuf-format DJI djmd and dbgi timed metadata.
|
204
|
-
tags are
|
205
|
-
the Unknown option to 1
|
206
|
-
ID's are composed of the corresponding .proto
|
207
|
-
hierarchical protobuf field numbers.
|
204
|
+
Tags found in protobuf-format DJI djmd and dbgi timed metadata. The known
|
205
|
+
tags listed below are extracted by default, but unknown djmd tags may be
|
206
|
+
extracted as well by setting the Unknown option to 1, or 2 to also extract
|
207
|
+
unknown dbgi debug tags. Tag ID's are composed of the corresponding .proto
|
208
|
+
file name combined with the hierarchical protobuf field numbers.
|
208
209
|
|
209
210
|
ExifTool currently extracts timed GPS plus a few other tags from DJI devices
|
210
211
|
which use the following protocols: dvtm_AVATA2.proto (Avanta 2),
|
211
|
-
dvtm_ac203.proto (Osmo Action 4),
|
212
|
+
dvtm_ac203.proto (Osmo Action 4), dvtm_ac204.proto (Osmo Action 5) and
|
213
|
+
dvtm_wm265e.proto (Mavic 3).
|
214
|
+
|
215
|
+
Note that with the protobuf format, numerical tags missing from the output
|
216
|
+
for a given protocol should be considered to have the default value of 0.
|
212
217
|
},
|
213
218
|
Protocol => {
|
214
219
|
RawConv => q{
|
@@ -218,6 +223,10 @@ my %convFloat2 = (
|
|
218
223
|
return $val;
|
219
224
|
},
|
220
225
|
},
|
226
|
+
#
|
227
|
+
# Osmo Action 4
|
228
|
+
#
|
229
|
+
'dvtm_ac203_1-1-5' => 'SerialNumber', # (NC)
|
221
230
|
# dvtm_ac203_1-1-6 - some version number
|
222
231
|
'dvtm_ac203_1-1-10' => 'Model',
|
223
232
|
'dvtm_ac203_2-3' => {
|
@@ -243,6 +252,10 @@ my %convFloat2 = (
|
|
243
252
|
ValueConv => '$val =~ tr/-/:/; $val',
|
244
253
|
PrintConv => '$self->ConvertDateTime($val)',
|
245
254
|
},
|
255
|
+
#
|
256
|
+
# Osmo Action 5
|
257
|
+
#
|
258
|
+
'dvtm_ac204_1-1-5' => 'SerialNumber', # (NC)
|
246
259
|
# dvtm_ac204_1-1-6 - some version number
|
247
260
|
'dvtm_ac204_1-1-10' => 'Model',
|
248
261
|
'dvtm_ac204_2-3' => {
|
@@ -254,6 +267,7 @@ my %convFloat2 = (
|
|
254
267
|
Name => 'GPSInfo',
|
255
268
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
|
256
269
|
},
|
270
|
+
# dvtm_ac204_3-2-4-1 - shutter speed? (rational)
|
257
271
|
'dvtm_ac204_3-4-2-2' => {
|
258
272
|
Name => 'GPSAltitude',
|
259
273
|
Groups => { 2 => 'Location' },
|
@@ -268,10 +282,15 @@ my %convFloat2 = (
|
|
268
282
|
ValueConv => '$val =~ tr/-/:/; $val',
|
269
283
|
PrintConv => '$self->ConvertDateTime($val)',
|
270
284
|
},
|
285
|
+
#
|
286
|
+
# Avanta 2
|
287
|
+
#
|
271
288
|
# dvtm_AVATA2_1-1-2 - some version number
|
272
289
|
# dvtm_AVATA2_1-1-3 - some version number
|
290
|
+
'dvtm_AVATA2_1-1-5' => 'SerialNumber', # (NC)
|
273
291
|
'dvtm_AVATA2_1-1-10' => 'Model',
|
274
|
-
|
292
|
+
# dvtm_AVATA2_2-2-1-4 - model code?
|
293
|
+
'dvtm_AVATA2_2-2-3-1' => 'SerialNumber2', # (NC)
|
275
294
|
'dvtm_AVATA2_2-3' => {
|
276
295
|
Name => 'FrameInfo',
|
277
296
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
@@ -285,11 +304,45 @@ my %convFloat2 = (
|
|
285
304
|
ValueConv => '$val / 1e6',
|
286
305
|
},
|
287
306
|
# dvtm_AVATA2_3-2-1-4 - model code?
|
307
|
+
# dvtm_AVATA2_3-2-1-5 - frame rate?
|
308
|
+
# dvtm_AVATA2_3-2-4-1 - shutter speed? (rational)
|
288
309
|
# dvtm_AVATA2_3-4-1-4 - model code?
|
310
|
+
# dvtm_AVATA2_3-4-3-1,2,3 - YPR? (int64s)
|
289
311
|
'dvtm_AVATA2_3-4-4-1' => {
|
290
312
|
Name => 'GPSInfo',
|
291
313
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
|
292
314
|
},
|
315
|
+
#
|
316
|
+
# Mavic 3
|
317
|
+
#
|
318
|
+
'dvtm_wm265e_1-1-5' => 'SerialNumber', # (confirmed)
|
319
|
+
'dvtm_wm265e_1-1-10' => 'Model',
|
320
|
+
'dvtm_wm265e_2-2' => {
|
321
|
+
Name => 'FrameInfo',
|
322
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
323
|
+
},
|
324
|
+
# dvtm_wm265e_3-2-1-4 - model code?
|
325
|
+
'dvtm_wm265e_3-2-2-1' => { Name => 'ISO', Format => 'float' },
|
326
|
+
'dvtm_wm265e_3-2-3-1' => {
|
327
|
+
Name => 'ShutterSpeed',
|
328
|
+
Format => 'rational',
|
329
|
+
ValueConv => '$val =~ m{(.*)/(.*)} ? $1 / $2 : $val',
|
330
|
+
PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
|
331
|
+
},
|
332
|
+
# dvtm_wm265e_3-2-5-1 - unknown rational (xxxx / 1000)
|
333
|
+
'dvtm_wm265e_3-2-6-1' => { Name => 'DigitalZoom', Format => 'float' },
|
334
|
+
'dvtm_wm265e_3-3-4-1' => {
|
335
|
+
Name => 'GPSInfo',
|
336
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
|
337
|
+
},
|
338
|
+
'dvtm_wm265e_3-3-3-1' => { Name => 'DroneRoll', Format => 'int64s', ValueConv => '$val/10' },
|
339
|
+
'dvtm_wm265e_3-3-3-2' => { Name => 'DronePitch', Format => 'int64s', ValueConv => '$val/10' },
|
340
|
+
'dvtm_wm265e_3-3-3-3' => { Name => 'DroneYaw', Format => 'int64s', ValueConv => '$val/10' },
|
341
|
+
'dvtm_wm265e_3-3-4-2' => { Name => 'AbsoluteAltitude', ValueConv => '$val / 1000' },
|
342
|
+
'dvtm_wm265e_3-3-5-1' => { Name => 'RelativeAltitude', Format => 'float', ValueConv => '$val / 1000' },
|
343
|
+
'dvtm_wm265e_3-4-3-1' => { Name => 'GimbalPitch',Format => 'int64s', ValueConv => '$val / 10' },
|
344
|
+
'dvtm_wm265e_3-4-3-2' => { Name => 'GimbalRoll', Format => 'int64s', ValueConv => '$val / 10' },
|
345
|
+
'dvtm_wm265e_3-4-3-3' => { Name => 'GimbalYaw', Format => 'int64s', ValueConv => '$val / 10' },
|
293
346
|
);
|
294
347
|
|
295
348
|
%Image::ExifTool::DJI::FrameInfo = (
|
@@ -22,7 +22,7 @@ use strict;
|
|
22
22
|
use vars qw($VERSION);
|
23
23
|
use Image::ExifTool qw(:DataAccess :Utils);
|
24
24
|
|
25
|
-
$VERSION = '1.
|
25
|
+
$VERSION = '1.22';
|
26
26
|
|
27
27
|
sub ProcessPEResources($$);
|
28
28
|
sub ProcessPEVersion($$);
|
@@ -194,6 +194,8 @@ my %int32uTime = (
|
|
194
194
|
Name => 'MachineType',
|
195
195
|
PrintHex => 1,
|
196
196
|
PrintConv => {
|
197
|
+
0x0 => 'Unknown',
|
198
|
+
0x01 => 'Target host',
|
197
199
|
0x014c => 'Intel 386 or later, and compatibles',
|
198
200
|
0x014d => 'Intel i860', #5
|
199
201
|
0x0162 => 'MIPS R3000',
|
@@ -204,10 +206,12 @@ my %int32uTime = (
|
|
204
206
|
0x0184 => 'Alpha AXP',
|
205
207
|
0x01a2 => 'Hitachi SH3',
|
206
208
|
0x01a3 => 'Hitachi SH3 DSP',
|
209
|
+
0x01a4 => 'Hitachi SH3E',
|
207
210
|
0x01a6 => 'Hitachi SH4',
|
208
211
|
0x01a8 => 'Hitachi SH5',
|
209
212
|
0x01c0 => 'ARM little endian',
|
210
213
|
0x01c2 => 'Thumb',
|
214
|
+
0x01c4 => 'Thumb 2 little endian',
|
211
215
|
0x01d3 => 'Matsushita AM33',
|
212
216
|
0x01f0 => 'PowerPC little endian',
|
213
217
|
0x01f1 => 'PowerPC with floating point support',
|
@@ -217,16 +221,26 @@ my %int32uTime = (
|
|
217
221
|
0x0284 => 'Alpha AXP 64-bit',
|
218
222
|
0x0366 => 'MIPS with FPU',
|
219
223
|
0x0466 => 'MIPS16 with FPU',
|
224
|
+
0x0520 => 'Infineon Tricore',
|
220
225
|
0x0ebc => 'EFI Byte Code',
|
226
|
+
0x3a64 => 'Compiled Hybrid PE',
|
227
|
+
0x5032 => 'RISC-V 32-bit',
|
228
|
+
0x5064 => 'RISC-V 64-bit',
|
229
|
+
0x5128 => 'RISC-V 128-bit',
|
230
|
+
0x6232 => 'LoongArch 32-bit',
|
231
|
+
0x6264 => 'LoongArch 64-bit',
|
221
232
|
0x8664 => 'AMD AMD64',
|
222
233
|
0x9041 => 'Mitsubishi M32R little endian',
|
234
|
+
0xaa64 => 'ARM64 little endian',
|
223
235
|
0xc0ee => 'clr pure MSIL',
|
236
|
+
0x0cef => 'CEF',
|
237
|
+
0xec20 => 'Dotnet 0xEC20'
|
224
238
|
},
|
225
239
|
},
|
226
240
|
2 => { Name => 'TimeStamp', %int32uTime },
|
227
241
|
9 => {
|
228
242
|
Name => 'ImageFileCharacteristics',
|
229
|
-
# ref https://docs.microsoft.com/en-us/windows/desktop/api/winnt/ns-winnt-
|
243
|
+
# ref https://docs.microsoft.com/en-us/windows/desktop/api/winnt/ns-winnt-image_file_header
|
230
244
|
PrintConv => { BITMASK => {
|
231
245
|
0 => 'No relocs',
|
232
246
|
1 => 'Executable',
|
@@ -1283,7 +1297,7 @@ sub ProcessEXE($$)
|
|
1283
1297
|
# read the rest of the optional header if necessary
|
1284
1298
|
my $optSize = Get16u(\$buff, 20);
|
1285
1299
|
my $more = $optSize + 24 - $size;
|
1286
|
-
my $magic;
|
1300
|
+
my $magic = 0;
|
1287
1301
|
if ($more > 0) {
|
1288
1302
|
if ($raf->Read($buf2, $more) == $more) {
|
1289
1303
|
$buff .= $buf2;
|
@@ -71,7 +71,7 @@ package Image::ExifTool::Geolocation;
|
|
71
71
|
use strict;
|
72
72
|
use vars qw($VERSION $geoDir $altDir $dbInfo);
|
73
73
|
|
74
|
-
$VERSION = '1.
|
74
|
+
$VERSION = '1.09'; # (this is the module version number, not the database version)
|
75
75
|
|
76
76
|
my $debug; # set to output processing time for testing
|
77
77
|
|
@@ -463,7 +463,7 @@ sub GetAltNames($;$)
|
|
463
463
|
sub Geolocate($;$)
|
464
464
|
{
|
465
465
|
my ($arg, $opts) = @_;
|
466
|
-
my ($city, @exact, %regex, @multiCity, $other, $idx, @cargs
|
466
|
+
my ($city, @exact, %regex, @multiCity, $other, $idx, @cargs);
|
467
467
|
my ($minPop, $minDistU, $minDistC, @matchParms, @coords, %fcOK, $both);
|
468
468
|
my ($pop, $maxDist, $multi, $fcodes, $altNames, @startTime);
|
469
469
|
|
@@ -594,8 +594,16 @@ Entry: for (; $i<@cityList; ++$i) {
|
|
594
594
|
}
|
595
595
|
@startTime and printf("= Processing time: %.3f sec\n", Time::HiRes::tv_interval(\@startTime));
|
596
596
|
if (%lastFound) {
|
597
|
-
@coords == 2
|
597
|
+
last if @coords == 2; # continue to use coords with last city matches
|
598
598
|
scalar(keys %lastFound) > 200 and warn("Too many matching cities\n"), return();
|
599
|
+
# return nearby cities if "num=" is used and only one match found
|
600
|
+
if ($num > 1 and scalar(keys %lastFound) == 1) {
|
601
|
+
my ($i) = keys %lastFound;
|
602
|
+
my @entry = GetEntry($i);
|
603
|
+
@coords = @entry[8,9];
|
604
|
+
SortDatabase('Latitude'); # (make sure we are sorted by latitude)
|
605
|
+
last;
|
606
|
+
}
|
599
607
|
unless (@lastByPop) {
|
600
608
|
@lastByPop = sort { $lastFound{$b} cmp $lastFound{$a} or $cityList[$a] cmp $cityList[$b] } keys %lastFound;
|
601
609
|
}
|
@@ -777,7 +785,7 @@ on the first call.
|
|
777
785
|
|
778
786
|
Sort database in specified order.
|
779
787
|
|
780
|
-
Image::ExifTool::Geolocation::
|
788
|
+
Image::ExifTool::Geolocation::SortDatabase('City');
|
781
789
|
|
782
790
|
=over 4
|
783
791
|
|
@@ -924,9 +932,10 @@ to the argument list:
|
|
924
932
|
both to determine the closest city matching the specified
|
925
933
|
name(s) instead of using GPS only.
|
926
934
|
|
927
|
-
'num=##' - When the search includes GPS coordinates,
|
928
|
-
|
929
|
-
|
935
|
+
'num=##' - When the search includes GPS coordinates, or when a single
|
936
|
+
city is matched by name, return the nearest ## cities instead
|
937
|
+
of just the closest or named one. Returned cities are in the
|
938
|
+
order from nearest to farthest.
|
930
939
|
|
931
940
|
See L<https://exiftool.org/geolocation.html#Read> for more details.
|
932
941
|
|
@@ -18,7 +18,7 @@ use strict;
|
|
18
18
|
use vars qw($VERSION);
|
19
19
|
use Image::ExifTool qw(:DataAccess :Utils);
|
20
20
|
|
21
|
-
$VERSION = '1.
|
21
|
+
$VERSION = '1.63';
|
22
22
|
|
23
23
|
sub ProcessID3v2($$$);
|
24
24
|
sub ProcessPrivate($$$);
|
@@ -1278,9 +1278,9 @@ sub ProcessID3v2($$$)
|
|
1278
1278
|
my $enc = unpack('C', $val);
|
1279
1279
|
my ($tag, $url);
|
1280
1280
|
if ($enc == 1 or $enc == 2) {
|
1281
|
-
($tag, $url) = ($
|
1281
|
+
($tag, $url) = ($val =~ /^(.(?:..)*?)\0\0(.*)/s);
|
1282
1282
|
} else {
|
1283
|
-
($tag, $url) = ($
|
1283
|
+
($tag, $url) = ($val =~ /^(..*?)\0(.*)/s);
|
1284
1284
|
}
|
1285
1285
|
unless (defined $tag and defined $url) {
|
1286
1286
|
$et->Warn("Invalid $id frame value");
|
@@ -1293,7 +1293,7 @@ sub ProcessID3v2($$$)
|
|
1293
1293
|
$tagInfo = $$tagTablePtr{$id} || AddTagToTable($tagTablePtr, $id, MakeTagName($tag));
|
1294
1294
|
}
|
1295
1295
|
$url =~ s/\0.*//s;
|
1296
|
-
$val = $url;
|
1296
|
+
$val = $et->Decode($url, 'Latin');
|
1297
1297
|
} elsif ($id =~ /^W/) {
|
1298
1298
|
$val =~ s/\0.*//s; # truncate at null
|
1299
1299
|
} elsif ($id =~ /^(COM|COMM|ULT|USLT)$/) {
|
@@ -11,7 +11,7 @@ use strict;
|
|
11
11
|
use vars qw($VERSION);
|
12
12
|
use Image::ExifTool qw(:DataAccess :Utils);
|
13
13
|
|
14
|
-
$VERSION = '1.
|
14
|
+
$VERSION = '1.39';
|
15
15
|
|
16
16
|
sub ProcessOcad($$$);
|
17
17
|
sub ProcessJPEG_HDR($$$);
|
@@ -347,6 +347,10 @@ sub ProcessJPEG_HDR($$$);
|
|
347
347
|
Name => 'Samsung',
|
348
348
|
Condition => '$$valPt =~ /QDIOBS$/',
|
349
349
|
SubDirectory => { TagTable => 'Image::ExifTool::Samsung::Trailer' },
|
350
|
+
}, {
|
351
|
+
Name => 'Vivo',
|
352
|
+
Condition => '$$valPt =~ /^(streamdata|vivo\{")/',
|
353
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Vivo::Main' },
|
350
354
|
}, {
|
351
355
|
Name => 'EmbeddedVideo',
|
352
356
|
Notes => 'extracted only when ExtractEmbedded option is used',
|
@@ -269,6 +269,7 @@ sub ParseLigoGPS($$$;$)
|
|
269
269
|
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
|
270
270
|
# 3) 1=LIGOGPS lat/lon/spd weren't fuzzed
|
271
271
|
# Returns: 1 on success
|
272
|
+
# Notes: The directory data should start with the string "LIGOGPSINFO\0"
|
272
273
|
sub ProcessLigoGPS($$$;$)
|
273
274
|
{
|
274
275
|
my ($et, $dirInfo, $tagTbl, $noFuzz) = @_;
|
@@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
14
14
|
use Image::ExifTool::Exif;
|
15
15
|
use Image::ExifTool::GPS;
|
16
16
|
|
17
|
-
$VERSION = '1.
|
17
|
+
$VERSION = '1.56';
|
18
18
|
|
19
19
|
sub ProcessMIE($$);
|
20
20
|
sub ProcessMIEGroup($$$);
|
@@ -1376,8 +1376,9 @@ sub WriteMIEGroup($$$)
|
|
1376
1376
|
my $term = "~\0\0\0";
|
1377
1377
|
unless ($$dirInfo{Parent}) {
|
1378
1378
|
# write extended terminator for file-level group
|
1379
|
-
my $len = ref $outfile eq 'SCALAR' ? length($$outfile) : tell $outfile;
|
1380
|
-
|
1379
|
+
my $len = ref $outfile eq 'SCALAR' ? length($$outfile) || 0 : tell $outfile;
|
1380
|
+
# include length of terminator itself minus original $outfile position
|
1381
|
+
$len += 10 - ($$dirInfo{OutPos} || 0);
|
1381
1382
|
if ($len and $len <= 0x7fffffff) {
|
1382
1383
|
$term = "~\0\0\x06" . Set32u($len) . MIEGroupFormat(1) . "\x04";
|
1383
1384
|
}
|
@@ -1802,6 +1803,8 @@ sub ProcessMIE($$)
|
|
1802
1803
|
# don't define Parent so WriteMIEGroup() writes extended terminator
|
1803
1804
|
);
|
1804
1805
|
if ($outfile) {
|
1806
|
+
# save start position in $outfile
|
1807
|
+
$subdirInfo{OutPos} = ref $outfile eq 'SCALAR' ? length($$outfile) || 0 : tell $outfile;
|
1805
1808
|
# generate lookup for MIE format codes if not done already
|
1806
1809
|
unless (%mieCode) {
|
1807
1810
|
foreach (keys %mieFormat) {
|