exiftool_vendored 13.40.0 → 13.42.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.
@@ -57,7 +57,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
57
57
  use Image::ExifTool qw(:DataAccess :Utils);
58
58
  use Image::ExifTool::MakerNotes;
59
59
 
60
- $VERSION = '4.60';
60
+ $VERSION = '4.61';
61
61
 
62
62
  sub ProcessExif($$$);
63
63
  sub WriteExif($$$);
@@ -6191,10 +6191,15 @@ sub ProcessExif($$$)
6191
6191
  my $isExif = ($tagTablePtr eq \%Image::ExifTool::Exif::Main);
6192
6192
 
6193
6193
  # warn for incorrect maker notes in CR3 files
6194
- if ($$dirInfo{DirName} eq 'MakerNotes' and $$et{FileType} eq 'CR3' and
6195
- $$dirInfo{Parent} and $$dirInfo{Parent} eq 'ExifIFD')
6196
- {
6197
- $et->Warn("MakerNotes shouldn't exist ExifIFD of CR3 image", 1);
6194
+ if ($dirName eq 'MakerNotes') {
6195
+ if ($$et{FileType} eq 'CR3' and $$dirInfo{Parent} and $$dirInfo{Parent} eq 'ExifIFD') {
6196
+ $et->Warn("MakerNotes shouldn't exist ExifIFD of CR3 image", 1);
6197
+ }
6198
+ if ($$dirInfo{TagInfo} and $$dirInfo{TagInfo}{MakerNotes} and
6199
+ $$et{ExifByteOrder} and $$et{ExifByteOrder} ne GetByteOrder())
6200
+ {
6201
+ $et->FoundTag(MakerNoteByteOrder => GetByteOrder());
6202
+ }
6198
6203
  }
6199
6204
  # set flag to calculate image data hash if requested
6200
6205
  $doHash = 1 if $$et{ImageDataHash} and (($$et{FILE_TYPE} eq 'TIFF' and not $base and not $inMakerNotes) or
@@ -6281,7 +6286,7 @@ sub ProcessExif($$$)
6281
6286
  $dirSize = 2 + 12 * $numEntries;
6282
6287
  $dirEnd = $dirStart + $dirSize;
6283
6288
  }
6284
- $verbose > 0 and $et->VerboseDir($dirName, $numEntries);
6289
+ $verbose > 0 and $et->VerboseDir($dirName, $numEntries, undef, GetByteOrder());
6285
6290
  my $bytesFromEnd = $dataLen - $dirEnd;
6286
6291
  if ($bytesFromEnd < 4) {
6287
6292
  unless ($bytesFromEnd==2 or $bytesFromEnd==0) {
@@ -184,7 +184,7 @@ my %ttCharset = (
184
184
  Custom => { },
185
185
  );
186
186
 
187
- # codes for the 63 known WOFF2 tags
187
+ # the 63 known WOFF2 tags
188
188
  my @knownTags = (
189
189
  'cmap', 'head', 'hhea', 'hmtx', 'maxp', 'name', 'OS/2', 'post', 'cvt',
190
190
  'fpgm', 'glyf', 'loca', 'prep', 'CFF', 'VORG', 'EBDT', 'EBLC', 'gasp',
@@ -891,9 +891,8 @@ This module is used by Image::ExifTool
891
891
 
892
892
  This module contains the routines required by Image::ExifTool to read meta
893
893
  information from various format font files. Currently recognized font file
894
- types are OTF, TTF, TTC, DFONT, PFA, PFB, PFM, AFM, ACFM and AMFM. As well,
895
- WOFF and WOFF2 font files are identified, but metadata is not currently
896
- extracted from these formats.
894
+ types are OTF, TTF, TTC, DFONT, PFA, PFB, PFM, AFM, ACFM, AMFM, WOFF and
895
+ WOFF2.
897
896
 
898
897
  =head1 AUTHOR
899
898
 
@@ -26,7 +26,7 @@ use strict;
26
26
  use vars qw($VERSION);
27
27
  use Image::ExifTool qw(:DataAccess :Utils);
28
28
 
29
- $VERSION = '1.41';
29
+ $VERSION = '1.42';
30
30
 
31
31
  sub ProcessICC($$);
32
32
  sub ProcessICC_Profile($$$);
@@ -330,6 +330,7 @@ my %manuSig = ( #6
330
330
  'WTG2' => 'Ware To Go',
331
331
  'WYSE' => 'WYSE Technology',
332
332
  'XERX' => 'Xerox Corporation',
333
+ 'XM ' => 'Xiaomi',
333
334
  'XRIT' => 'X-Rite',
334
335
  'yxym' => 'YxyMaster GmbH',
335
336
  'Z123' => "Lavanya's test Company",
@@ -14,9 +14,9 @@ use vars qw($VERSION);
14
14
  use Image::ExifTool qw(:DataAccess :Utils);
15
15
  use Image::ExifTool::Import;
16
16
 
17
- $VERSION = '1.10';
17
+ $VERSION = '1.11';
18
18
 
19
- sub ProcessJSON($$);
19
+ sub ProcessJSON($$;$);
20
20
  sub ProcessTag($$$$%);
21
21
 
22
22
  %Image::ExifTool::JSON::Main = (
@@ -71,6 +71,7 @@ sub FoundTag($$$$%)
71
71
  $name = Image::ExifTool::MakeTagName($name);
72
72
  my $desc = Image::ExifTool::MakeDescription($name);
73
73
  $desc =~ s/^C2 PA/C2PA/; # hack to get "C2PA" correct
74
+ $et->VPrint(0, $$et{INDENT}, "[adding $tag]\n");
74
75
  AddTagToTable($tagTablePtr, $tag, {
75
76
  Name => $name,
76
77
  Description => $desc,
@@ -112,12 +113,12 @@ sub ProcessTag($$$$%)
112
113
 
113
114
  #------------------------------------------------------------------------------
114
115
  # Extract meta information from a JSON file
115
- # Inputs: 0) ExifTool object reference, 1) dirInfo reference
116
+ # Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) tag table ref
116
117
  # Returns: 1 on success, 0 if this wasn't a recognized JSON file
117
- sub ProcessJSON($$)
118
+ sub ProcessJSON($$;$)
118
119
  {
119
120
  local $_;
120
- my ($et, $dirInfo) = @_;
121
+ my ($et, $dirInfo, $tagTablePtr) = @_;
121
122
  my $raf = $$dirInfo{RAF};
122
123
  my $structOpt = $et->Options('Struct');
123
124
  my (%database, $key, $tag, $dataPt);
@@ -149,7 +150,7 @@ sub ProcessJSON($$)
149
150
 
150
151
  $et->SetFileType() unless $dataPt;
151
152
 
152
- my $tagTablePtr = GetTagTable('Image::ExifTool::JSON::Main');
153
+ $tagTablePtr or $tagTablePtr = GetTagTable('Image::ExifTool::JSON::Main');
153
154
 
154
155
  # remove any old tag definitions in case they change flags
155
156
  foreach $key (TagTableKeys($tagTablePtr)) {
@@ -18,7 +18,7 @@ use vars qw($VERSION);
18
18
  use Image::ExifTool qw(:DataAccess :Utils);
19
19
  use Image::ExifTool::Microsoft;
20
20
 
21
- $VERSION = '1.12';
21
+ $VERSION = '1.13';
22
22
 
23
23
  sub ProcessItemID($$$);
24
24
  sub ProcessLinkInfo($$$);
@@ -191,7 +191,7 @@ sub ProcessLinkInfo($$$);
191
191
  },
192
192
  0xa0000001 => {
193
193
  Name => 'EnvVarData',
194
- SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' },
194
+ SubDirectory => { TagTable => 'Image::ExifTool::LNK::EnvVarData' },
195
195
  },
196
196
  0xa0000002 => {
197
197
  Name => 'ConsoleData',
@@ -448,6 +448,19 @@ sub ProcessLinkInfo($$$);
448
448
  },
449
449
  );
450
450
 
451
+ %Image::ExifTool::LNK::EnvVarData = (
452
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
453
+ GROUPS => { 2 => 'Other' },
454
+ 8 => {
455
+ Name => 'EnvironmentTarget',
456
+ Format => 'string[260]',
457
+ },
458
+ 268 => {
459
+ Name => 'EnvironmentTargetUnicode',
460
+ Format => 'unicode[260]',
461
+ },
462
+ );
463
+
451
464
  %Image::ExifTool::LNK::INI = (
452
465
  GROUPS => { 2 => 'Document' },
453
466
  VARS => { ID_FMT => 'none' },
@@ -42,7 +42,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
42
42
  use Image::ExifTool::Exif;
43
43
  use Image::ExifTool::APP12;
44
44
 
45
- $VERSION = '2.92';
45
+ $VERSION = '2.93';
46
46
 
47
47
  sub PrintLensInfo($$$);
48
48
 
@@ -201,8 +201,9 @@ my %olympusLensTypes = (
201
201
  # '65535 07 40' - Seen for LUMIX S 16-35/F4 on Panasonic DC-S1H (ref PH)
202
202
  # Other makes
203
203
  '24 01 10' => 'Venus Optics Laowa 50mm F2.8 2x Macro', #DonKomarechka
204
- 'f7 03 10' => 'LAOWA C&D-Dreamer MFT 7.5mm F2.0', #forum3833
205
- 'f7 10 10' => 'LAOWA C&D-Dreamer MFT 6.0mm F2.0', #KG
204
+ '247 03 10' => 'LAOWA C&D-Dreamer MFT 7.5mm F2.0', #forum3833
205
+ '247 10 10' => 'LAOWA C&D-Dreamer MFT 6.0mm F2.0', #KG
206
+ '65522 02 10' => 'Xiaoyi 42.5mm F1.8', #github363
206
207
  );
207
208
 
208
209
  # lookup for Olympus camera types (ref PH)
@@ -49,7 +49,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
49
49
  use Image::ExifTool::Exif;
50
50
  use Image::ExifTool::GPS;
51
51
 
52
- $VERSION = '3.22';
52
+ $VERSION = '3.23';
53
53
 
54
54
  sub ProcessMOV($$;$);
55
55
  sub ProcessKeys($$$);
@@ -578,11 +578,29 @@ my %userDefined = (
578
578
  return substr($val, 8, $len-8);
579
579
  },
580
580
  Binary => 1,
581
+ },{
582
+ Name => 'HighlightMarkers',
583
+ # (DJI Action 4, forum17700)
584
+ Notes => 'written by some DJI models',
585
+ Condition => '$$valPt =~ /^data.{4}hglg.{5}/s',
586
+ RawConv => q{
587
+ my $len = unpack 'x4N', $val;
588
+ return undef if $len < 13 or $len + 4 > length($val);
589
+ my $n = int(($len - 13) / 5);
590
+ my @a = map $_/1000, unpack "x17(xV)$n", $val;
591
+ return \@a;
592
+ },
581
593
  },{
582
594
  Unknown => 1,
583
595
  Binary => 1,
584
596
  },
585
- # (also Samsung WB750 uncompressed thumbnail data starting with "SDIC\0")
597
+ # DJI videos also have block of offset/size of various atoms, eg)
598
+ # Atom name ???? Offset Size
599
+ # 0000: 63 6f 76 72 00 00 00 00 00 ed 6f da 00 0a 46 e0 [covr......o...F.]
600
+ # 0010: 73 6e 61 6c 00 00 00 00 00 f7 b6 d2 00 0a 46 e0 [snal..........F.]
601
+ # 0020: 68 67 6c 67 00 00 00 00 01 02 0a a2 00 00 00 21 [hglg...........!]
602
+ # 0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
603
+ # (also Samsung WB750 uncompressed thumbnail data starting with "SDIC\0")
586
604
  ],
587
605
  # fre1 - 4 bytes: "june" (Kodak PixPro SP360)
588
606
  frea => {
@@ -2815,6 +2833,7 @@ my %userDefined = (
2815
2833
  'xml ' => {
2816
2834
  Name => 'XML',
2817
2835
  Flags => [ 'Binary', 'Protected' ],
2836
+ BlockExtract => 1,
2818
2837
  SubDirectory => {
2819
2838
  TagTable => 'Image::ExifTool::XMP::XML',
2820
2839
  IgnoreProp => { NonRealTimeMeta => 1 }, # ignore container for Sony 'nrtm'
@@ -2865,6 +2884,7 @@ my %userDefined = (
2865
2884
  },
2866
2885
  idat => {
2867
2886
  Name => 'MetaImageSize', #PH (NC)
2887
+ Condition => '$$self{FileType} eq "HEIC"',
2868
2888
  Format => 'int16u',
2869
2889
  # (don't know what the first two numbers are for)
2870
2890
  PrintConv => '$val =~ s/^(\d+) (\d+) (\d+) (\d+)/${3}x$4/; $val',
@@ -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.01';
17
+ $VERSION = '1.02';
18
18
 
19
19
  sub ProcessR3D($$);
20
20
 
@@ -45,7 +45,8 @@ my $errTrunc = 'Truncated R3D file';
45
45
  RED2 => { Name => 'Red2Header', SubDirectory => { TagTable => 'Image::ExifTool::Red::RED2' } },
46
46
 
47
47
  # (upper 4 bits of tag ID are the format code)
48
- # ---- format 1 ----
48
+ # ---- format 0 (int8u) ----
49
+ # ---- format 1 (string) ----
49
50
  0x1000 => 'StartEdgeCode', #1
50
51
  0x1001 => { Name => 'StartTimecode', Groups => { 2 => 'Time' } }, #1
51
52
  0x1002 => { #1
@@ -104,6 +105,7 @@ my $errTrunc = 'Truncated R3D file';
104
105
  # 0x1041 - seen 'NA'
105
106
  0x1042 => 'Revision', # ? (seen "TODO, rev EPIC-1.0" and "MYSTERIUM X, rev EPIC-1.0")
106
107
  # 0x1051 - seen 'C', 'L'
108
+ # 0x1052 - seen 'E9'
107
109
  0x1056 => 'OriginalFileName',
108
110
  0x106e => 'LensMake',
109
111
  0x106f => 'LensNumber', # (last 2 hex digits are LensType)
@@ -120,7 +122,8 @@ my $errTrunc = 'Truncated R3D file';
120
122
  0x1096 => 'Filter', # optical low-pass filter
121
123
  0x10a0 => 'Brain',
122
124
  0x10a1 => 'Sensor',
123
- # ---- format 2 ----
125
+ 0x10be => 'Quality',
126
+ # ---- format 2 (float) ----
124
127
  0x200d => 'ColorTemperature',
125
128
  # 0x200e - (sometimes this is frame rate)
126
129
  # 0x2015 - seen '1 1 1' (RGBGain or RGBGamma?)
@@ -130,7 +133,8 @@ my $errTrunc = 'Truncated R3D file';
130
133
  Groups => { 2 => 'Video' },
131
134
  PrintConv => 'int($val * 1000 + 0.5) / 1000',
132
135
  },
133
- # ---- format 4 ----
136
+ # ---- format 3 (int8u?) ----
137
+ # ---- format 4 (int16u) ----
134
138
  0x4037 => { Name => 'CropArea' }, # (NC)
135
139
  0x403b => 'ISO',
136
140
  # 0x404e - related to CropArea (or "0 0 0 0")
@@ -138,8 +142,12 @@ my $errTrunc = 'Truncated R3D file';
138
142
  0x406b => 'FocalLength',
139
143
  # 0x4084 - related to ISO?
140
144
  # 0x4087 - related to ISO?
141
- # ---- format 6 ----
145
+ # ---- format 5 (int8s?) ----
146
+ # ---- format 6 (int32s) ----
142
147
  0x606c => { Name => 'FocusDistance', ValueConv => '$val/1000', PrintConv => '"$val m"' },
148
+ # ---- format 7 (undef? structure?) ----
149
+ # ---- format 8 (int32u?) ----
150
+ # ---- format 9 (undef?) ----
143
151
  );
144
152
 
145
153
  # RED1 file header (ref PH)
@@ -240,9 +248,11 @@ sub ProcessR3D($$)
240
248
  $pos = 0x22; # directory starts at offset 0x22
241
249
  } else {
242
250
  # calculate position of Red directory start
243
- length($buff) < 0x41 and return $et->Warn($errTrunc);
244
- my $n = Get8u(\$buff, 0x40); # number of "rdi" records
245
- $pos = 0x44 + $n * 0x18;
251
+ $pos = 0x44;
252
+ length($buff) < $pos and return $et->Warn($errTrunc);
253
+ $pos += Get8u(\$buff, 0x40) * 0x18; # skip "rdi" records
254
+ $pos += Get8u(\$buff, 0x41) * 0x14; # skip "rda" records
255
+ $pos += Get8u(\$buff, 0x42) * 0x10; # skip "rdx" records
246
256
  }
247
257
  if ($pos + 8 > length $buff) {
248
258
  $dirLen = 0; # find directory the hard way
@@ -253,7 +263,7 @@ sub ProcessR3D($$)
253
263
  # do sanity check on the directory size (in case our assumptions were wrong)
254
264
  if ($dirLen < 300 or $dirLen >= 2048 or $pos + $dirLen > length $buff) {
255
265
  # tag 0x1000 with length 0x000f should be near the directory start
256
- $buff =~ /\0\x0f\x10\0/g or return $et->Warn("Can't find Red directory");
266
+ $buff =~ /\0\x0f\x10[\0\x06]/g or return $et->Warn("Can't find Red directory. Please submit sample for testing");
257
267
  $pos = pos($buff) - 4;
258
268
  $dirEnd = length $buff;
259
269
  undef $dirLen;
@@ -21,8 +21,9 @@ use strict;
21
21
  use vars qw($VERSION %samsungLensTypes);
22
22
  use Image::ExifTool qw(:DataAccess :Utils);
23
23
  use Image::ExifTool::Exif;
24
+ use Image::ExifTool::JSON;
24
25
 
25
- $VERSION = '1.58';
26
+ $VERSION = '1.59';
26
27
 
27
28
  sub WriteSTMN($$$);
28
29
  sub ProcessINFO($$$);
@@ -1277,7 +1278,15 @@ my %formatMinMax = (
1277
1278
  # 0x0b51-name - seen 'Intelligent_PhotoEditor_Data' #forum16086
1278
1279
  # 0x0b60-name - seen 'UltraWide_PhotoEditor_Data' #forum16086
1279
1280
  # 0x0b90-name - seen 'Document_Scan_Info' #forum16086
1280
- # 0x0ba1-name - seen 'Original_Path_Hash_Key', 'PhotoEditor_Re_Edit_Data', 'deco_doodle_bitmap', 'deco_sticker_bitmap', 'deco_text_bitmap'
1281
+ # 0x0ba1-name - seen 'Original_Path_Hash_Key', 'PhotoEditor_Re_Edit_Data', 'deco_doodle_bitmap', 'deco_sticker_bitmap', 'deco_text_bitmap','PhotoEditor_Re_Edit_Data'
1282
+ '0x0ba1' => [{
1283
+ Name => 'ReEditData',
1284
+ Condition => '$$self{SamsungTagName} eq "PhotoEditor_Re_Edit_Data"',
1285
+ SubDirectory => { TagTable => 'Image::ExifTool::Samsung::ReEditData' },
1286
+ },{
1287
+ Name => 'OriginalPathHashKey',
1288
+ Condition => '$$self{SamsungTagName} eq "Original_Path_Hash_Key"',
1289
+ }],
1281
1290
  # 0x0ba2-name - seen 'Copy_Available_Edit_Info' #forum16086
1282
1291
  # 0x0bc0-name - seen 'Single_Relighting_Bokeh_Info' #forum16086
1283
1292
  # 0x0bd0-name - seen 'Dual_Relighting_Bokeh_Info' #forum16086
@@ -1300,7 +1309,7 @@ my %formatMinMax = (
1300
1309
  '0x0d91' => { #forum16086/16242
1301
1310
  Name => 'PEg_Info',
1302
1311
  Description => 'PEg Info',
1303
- SubDirectory => { TagTable => 'Image::ExifTool::JSON::Main' },
1312
+ SubDirectory => { TagTable => 'Image::ExifTool::Samsung::PEgInfo' },
1304
1313
  },
1305
1314
  # 0x0da1-name - seen 'Captured_App_Info' #forum16086
1306
1315
  # 0xa050-name - seen 'Jpeg360_2D_Info' (Samsung Gear 360)
@@ -1380,6 +1389,113 @@ my %formatMinMax = (
1380
1389
  perfMode => { },
1381
1390
  );
1382
1391
 
1392
+ %Image::ExifTool::Samsung::ReEditData = (
1393
+ GROUPS => { 0 => 'JSON', 2 => 'Image' },
1394
+ PROCESS_PROC => \&Image::ExifTool::JSON::ProcessJSON,
1395
+ VARS => { LONG_TAGS => 2 },
1396
+ originalPath => { },
1397
+ representativeFrameLoc => { },
1398
+ startMotionVideo => { },
1399
+ endMotionVideo => { },
1400
+ isMotionVideoMute => { },
1401
+ isTrimMotionVideo => { },
1402
+ clipInfoValue => { SubDirectory => { TagTable => 'Image::ExifTool::Samsung::ClipInfo' } },
1403
+ toneValue => { SubDirectory => { TagTable => 'Image::ExifTool::Samsung::ToneInfo' } },
1404
+ effectValue => { SubDirectory => { TagTable => 'Image::ExifTool::Samsung::EffectInfo' } },
1405
+ portraitEffectValue => { SubDirectory => { TagTable => 'Image::ExifTool::Samsung::PortraitEffect' } },
1406
+ isBlending => { },
1407
+ isNotReEdit => { },
1408
+ sepVersion => { Name => 'SEPVersion' },
1409
+ ndeVersion => { Name => 'NDEVersion' },
1410
+ reSize => { },
1411
+ isScaleAI => { },
1412
+ rotation => { },
1413
+ adjustmentValue => { },
1414
+ isApplyShapeCorrection => { },
1415
+ isNewReEditOnly => { },
1416
+ isDecoReEditOnly => { },
1417
+ isAIFilterReEditOnly=> { },
1418
+ );
1419
+
1420
+ %Image::ExifTool::Samsung::ClipInfo = (
1421
+ GROUPS => { 0 => 'JSON', 2 => 'Image' },
1422
+ PROCESS_PROC => \&Image::ExifTool::JSON::ProcessJSON,
1423
+ mCenterX => { Name => 'ClipCenterX' },
1424
+ mCenterY => { Name => 'ClipCenterY' },
1425
+ mWidth => { Name => 'ClipWidth' },
1426
+ mHeight => { Name => 'ClipHeight' },
1427
+ mRotation => { Name => 'ClipRotation' },
1428
+ mRotate => { Name => 'ClipRotate' },
1429
+ mHFlip => { Name => 'ClipHFlip' },
1430
+ mVFlip => { Name => 'ClipVFlip' },
1431
+ mRotationEffect => { Name => 'ClipRotationEffect' },
1432
+ mRotateEffect => { Name => 'ClipRotateEffect' },
1433
+ mHFlipEffect => { Name => 'ClipHFlipEffect' },
1434
+ mVFlipEffect => { Name => 'ClipVFlipEffect' },
1435
+ mHozPerspective => { Name => 'ClipHozPerspective' },
1436
+ mVerPerspective => { Name => 'ClipVerPerspective' },
1437
+ );
1438
+
1439
+ %Image::ExifTool::Samsung::ToneInfo = (
1440
+ GROUPS => { 0 => 'JSON', 2 => 'Image' },
1441
+ PROCESS_PROC => \&Image::ExifTool::JSON::ProcessJSON,
1442
+ brightness => { },
1443
+ exposure => { },
1444
+ contrast => { },
1445
+ saturation => { },
1446
+ hue => { },
1447
+ wbMode => { Name => 'WBMode' },
1448
+ wbTemperature => { Name => 'WBTemperature' },
1449
+ tint => { },
1450
+ shadow => { },
1451
+ highlight => { },
1452
+ lightbalance => { },
1453
+ sharpness => { },
1454
+ definition => { },
1455
+ isBrightnessIPE => { },
1456
+ isExposureIPE => { },
1457
+ isContrastIPE => { },
1458
+ isSaturationIPE => { },
1459
+ );
1460
+
1461
+ %Image::ExifTool::Samsung::EffectInfo = (
1462
+ GROUPS => { 0 => 'JSON', 2 => 'Image' },
1463
+ PROCESS_PROC => \&Image::ExifTool::JSON::ProcessJSON,
1464
+ filterIndication=> { },
1465
+ alphaValue => { },
1466
+ filterType => { },
1467
+ );
1468
+
1469
+ %Image::ExifTool::Samsung::PortraitEffect = (
1470
+ GROUPS => { 0 => 'JSON', 2 => 'Image' },
1471
+ PROCESS_PROC => \&Image::ExifTool::JSON::ProcessJSON,
1472
+ VARS => { LONG_TAGS => 1 },
1473
+ effectId => { Name => 'PortraitEffectID' },
1474
+ effectLevel => { Name => 'PortraitEffectLevel' },
1475
+ exifRotation => { Name => 'PortraitExifRotation' },
1476
+ lightLevel => { Name => 'PortraitLightLevel' },
1477
+ touchX => { Name => 'PortraitTouchX' },
1478
+ touchY => { Name => 'PortraitTouchY' },
1479
+ refocusX => { Name => 'PortraitRefocusX' },
1480
+ refocusY => { Name => 'PortraitRefocusY' },
1481
+ effectIdOriginal => { Name => 'PortraitEffectIDOriginal' },
1482
+ effectLevelOriginal => { Name => 'EffectLevelOriginal' },
1483
+ lightLevelOriginal => { Name => 'LightLevelOriginal' },
1484
+ touchXOriginal => { },
1485
+ touchYOriginal => { },
1486
+ refocusXOriginal=> { },
1487
+ refocusYOriginal=> { },
1488
+ waterMarkRemoved=> { Name => 'WaterMarkRemoved' },
1489
+ waterMarkRemovedOriginal => { Name => 'WaterMarkRemovedOriginal' },
1490
+ );
1491
+
1492
+ %Image::ExifTool::Samsung::PEgInfo = (
1493
+ GROUPS => { 0 => 'JSON', 2 => 'Image' },
1494
+ PROCESS_PROC => \&Image::ExifTool::JSON::ProcessJSON,
1495
+ genImageVersion => { },
1496
+ connectorType => { },
1497
+ );
1498
+
1383
1499
  # Samsung composite tags
1384
1500
  %Image::ExifTool::Samsung::Composite = (
1385
1501
  GROUPS => { 2 => 'Image' },
@@ -1625,7 +1741,14 @@ SamBlock:
1625
1741
  }
1626
1742
  next;
1627
1743
  }
1628
- last unless $buff =~ /^SEFH/ and $len >= 12; # validate SEFH header
1744
+ # validate SEFH header
1745
+ unless ($buff =~ /^SEFH/ and $len >= 12) {
1746
+ # tolerate extra junk written by Samsung Gallery
1747
+ last unless $buff =~ /\0\0SEFT/g;
1748
+ $et->Warn('Trailer likely corrupted by Samsung Gallery');
1749
+ $blockEnd += pos($buff);
1750
+ next;
1751
+ }
1629
1752
  my $dirPos = $raf->Tell() - $len;
1630
1753
  # my $ver = Get32u(\$buff, 0x04); # version (=101)
1631
1754
  my $count = Get32u(\$buff, 0x08);
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
34
34
  use Image::ExifTool::Exif;
35
35
  use Image::ExifTool::Minolta;
36
36
 
37
- $VERSION = '3.79';
37
+ $VERSION = '3.80';
38
38
 
39
39
  sub ProcessSRF($$$);
40
40
  sub ProcessSR2($$$);
@@ -10656,7 +10656,7 @@ my %isoSetting2010 = (
10656
10656
  0x8101 => { Name => 'Sony_rtmd_0x8101', Format => 'int8u', %hidUnk }, # seen: 0,1,2
10657
10657
  0x8104 => { Name => 'Sony_rtmd_0x8104', Format => 'int16u', %hidUnk }, # seen: 35616
10658
10658
  0x8105 => { Name => 'Sony_rtmd_0x8105', Format => 'int16u', %hidUnk }, # seen: 20092
10659
- 0x8106 => { Name => 'Sony_rtmd_0x8106', Format => 'int32u', %hidUnk }, # seen: "25 1","24000 1001" frame rate?
10659
+ 0x8106 => { Name => 'FrameRate', Format => 'rational64u', PrintConv => 'sprintf("%.2f",$val)' },
10660
10660
  0x8109 => { #forum12218
10661
10661
  Name => 'ExposureTime',
10662
10662
  Format => 'rational64u',
@@ -10674,7 +10674,9 @@ my %isoSetting2010 = (
10674
10674
  Format => 'int16u',
10675
10675
  },
10676
10676
  0x810d => { Name => 'Sony_rtmd_0x810d', Format => 'int8u', %hidUnk }, # seen: 0,1
10677
+ 0x8114 => { Name => 'SerialNumber', Format => 'string' }, # (and model, eg. "ILCE-7SM3 5072108")
10677
10678
  0x8115 => { Name => 'Sony_rtmd_0x8115', Format => 'int16u', %hidUnk }, # seen: 100 - ISO
10679
+ # 0x8119 - seen "P" (same as 0x811e?)
10678
10680
  # 0x8300 - container for other tags in this format
10679
10681
  0x8500 => {
10680
10682
  Name => 'GPSVersionID',