exiftool_vendored 12.16.0 → 12.25.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +137 -1
  3. data/bin/MANIFEST +12 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +44 -43
  7. data/bin/config_files/acdsee.config +193 -6
  8. data/bin/config_files/cuepointlist.config +70 -0
  9. data/bin/config_files/example.config +1 -8
  10. data/bin/exiftool +139 -98
  11. data/bin/fmt_files/gpx.fmt +1 -1
  12. data/bin/fmt_files/gpx_wpt.fmt +1 -1
  13. data/bin/fmt_files/kml.fmt +1 -1
  14. data/bin/fmt_files/kml_track.fmt +1 -1
  15. data/bin/lib/Image/ExifTool.pm +158 -49
  16. data/bin/lib/Image/ExifTool.pod +94 -75
  17. data/bin/lib/Image/ExifTool/Apple.pm +3 -2
  18. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +25 -14
  19. data/bin/lib/Image/ExifTool/Canon.pm +28 -3
  20. data/bin/lib/Image/ExifTool/CanonCustom.pm +19 -1
  21. data/bin/lib/Image/ExifTool/DJI.pm +6 -6
  22. data/bin/lib/Image/ExifTool/DjVu.pm +6 -5
  23. data/bin/lib/Image/ExifTool/Exif.pm +50 -22
  24. data/bin/lib/Image/ExifTool/FITS.pm +13 -2
  25. data/bin/lib/Image/ExifTool/FujiFilm.pm +19 -8
  26. data/bin/lib/Image/ExifTool/GPS.pm +24 -13
  27. data/bin/lib/Image/ExifTool/H264.pm +20 -5
  28. data/bin/lib/Image/ExifTool/ICC_Profile.pm +2 -2
  29. data/bin/lib/Image/ExifTool/JPEG.pm +6 -2
  30. data/bin/lib/Image/ExifTool/JSON.pm +24 -3
  31. data/bin/lib/Image/ExifTool/Jpeg2000.pm +361 -16
  32. data/bin/lib/Image/ExifTool/M2TS.pm +40 -4
  33. data/bin/lib/Image/ExifTool/MIE.pm +2 -2
  34. data/bin/lib/Image/ExifTool/MRC.pm +341 -0
  35. data/bin/lib/Image/ExifTool/MWG.pm +3 -3
  36. data/bin/lib/Image/ExifTool/MXF.pm +1 -1
  37. data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
  38. data/bin/lib/Image/ExifTool/Microsoft.pm +298 -82
  39. data/bin/lib/Image/ExifTool/Nikon.pm +5 -5
  40. data/bin/lib/Image/ExifTool/NikonSettings.pm +25 -16
  41. data/bin/lib/Image/ExifTool/Olympus.pm +2 -2
  42. data/bin/lib/Image/ExifTool/PNG.pm +2 -2
  43. data/bin/lib/Image/ExifTool/Panasonic.pm +14 -1
  44. data/bin/lib/Image/ExifTool/PhaseOne.pm +4 -3
  45. data/bin/lib/Image/ExifTool/QuickTime.pm +148 -68
  46. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +94 -34
  47. data/bin/lib/Image/ExifTool/README +5 -4
  48. data/bin/lib/Image/ExifTool/RIFF.pm +84 -12
  49. data/bin/lib/Image/ExifTool/Samsung.pm +2 -1
  50. data/bin/lib/Image/ExifTool/Shortcuts.pm +9 -0
  51. data/bin/lib/Image/ExifTool/Sony.pm +157 -49
  52. data/bin/lib/Image/ExifTool/TagInfoXML.pm +1 -0
  53. data/bin/lib/Image/ExifTool/TagLookup.pm +4079 -3987
  54. data/bin/lib/Image/ExifTool/TagNames.pod +642 -273
  55. data/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
  56. data/bin/lib/Image/ExifTool/WritePostScript.pl +1 -0
  57. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +44 -17
  58. data/bin/lib/Image/ExifTool/WriteXMP.pl +15 -8
  59. data/bin/lib/Image/ExifTool/Writer.pl +50 -14
  60. data/bin/lib/Image/ExifTool/XMP.pm +50 -11
  61. data/bin/perl-Image-ExifTool.spec +42 -42
  62. data/lib/exiftool_vendored/version.rb +1 -1
  63. metadata +52 -12
@@ -65,8 +65,9 @@ my @dateMax = ( 24, 59, 59, 2200, 12, 31 );
65
65
  my $gpsBlockSize = 0x8000;
66
66
 
67
67
  # conversion factors
68
- my $knotsToKph = 1.852; # knots --> km/h
69
- my $mpsToKph = 3.6; # m/s --> km/h
68
+ my $knotsToKph = 1.852; # knots --> km/h
69
+ my $mpsToKph = 3.6; # m/s --> km/h
70
+ my $mphToKph = 1.60934; # mph --> km/h
70
71
 
71
72
  # handler types to process based on MetaFormat/OtherFormat
72
73
  my %processByMetaFormat = (
@@ -96,7 +97,7 @@ my %insvLimit = (
96
97
  NOTES => q{
97
98
  Timed metadata extracted from QuickTime media data and some AVI videos when
98
99
  the ExtractEmbedded option is used. Although most of these tags are
99
- combined into the single table below, ExifTool currently reads 49 different
100
+ combined into the single table below, ExifTool currently reads 51 different
100
101
  formats of timed GPS metadata from video files.
101
102
  },
102
103
  VARS => { NO_ID => 1 },
@@ -139,6 +140,7 @@ my %insvLimit = (
139
140
  SampleTime => { Groups => { 2 => 'Video' }, PrintConv => 'ConvertDuration($val)', Notes => 'sample decoding time' },
140
141
  SampleDuration=>{ Groups => { 2 => 'Video' }, PrintConv => 'ConvertDuration($val)' },
141
142
  UserLabel => { Groups => { 2 => 'Other' } },
143
+ KiloCalories => { Groups => { 2 => 'Other' } },
142
144
  SampleDateTime => {
143
145
  Groups => { 2 => 'Time' },
144
146
  ValueConv => q{
@@ -1249,8 +1251,8 @@ sub ProcessSamples($)
1249
1251
  next if length($buff) < 20 + $n;
1250
1252
  $et->HandleTag($tagTbl, GPSLatitude => Get32s(\$buff, 12+$n) * 180/0x80000000);
1251
1253
  $et->HandleTag($tagTbl, GPSLongitude => Get32s(\$buff, 16+$n) * 180/0x80000000);
1252
- $et->HandleTag($tagTbl, GPSSpeed => Get16u(\$buff, 8+$n));
1253
- $et->HandleTag($tagTbl, GPSSpeedRef => 'M');
1254
+ $et->HandleTag($tagTbl, GPSSpeed => Get16u(\$buff, 8+$n) * $mphToKph);
1255
+ $et->HandleTag($tagTbl, GPSSpeedRef => 'K');
1254
1256
  SetGPSDateTime($et, $tagTbl, $time[$i]);
1255
1257
  next; # all done (don't store/process as text)
1256
1258
  }
@@ -2272,39 +2274,97 @@ sub ProcessNMEA($$$)
2272
2274
  {
2273
2275
  my ($et, $dirInfo, $tagTbl) = @_;
2274
2276
  my $dataPt = $$dirInfo{DataPt};
2275
- # parse only RMC sentence (with leading timestamp) for now
2276
- while ($$dataPt =~ /(?:\[(\d+)\])?\$[A-Z]{2}RMC,(\d{2})(\d{2})(\d+(\.\d*)?),A?,(\d+\.\d+),([NS]),(\d+\.\d+),([EW]),(\d*\.?\d*),(\d*\.?\d*),(\d{2})(\d{2})(\d+)/g) {
2277
- my $tc = $1; # milliseconds since 1970 (local time)
2278
- my ($lat,$latRef,$lon,$lonRef) = ($6,$7,$8,$9);
2279
- my $yr = $14 + ($14 >= 70 ? 1900 : 2000);
2280
- my ($mon,$day,$hr,$min,$sec) = ($13,$12,$2,$3,$4);
2281
- my ($spd, $trk);
2282
- $spd = $10 * $knotsToKph if length $10;
2283
- $trk = $11 if length $11;
2284
- # lat/long are in DDDMM.MMMM format
2285
- my $deg = int($lat / 100);
2286
- $lat = $deg + ($lat - $deg * 100) / 60;
2287
- $deg = int($lon / 100);
2288
- $lon = $deg + ($lon - $deg * 100) / 60;
2289
- $sec = '0' . $sec unless $sec =~ /^\d{2}/; # pad integer part of seconds to 2 digits
2290
- my $time = sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%sZ',$yr,$mon,$day,$hr,$min,$sec);
2291
- my $sampleTime;
2292
- $sampleTime = ($tc - $$et{StartTime}) / 1000 if $tc and $$et{StartTime};
2293
- FoundSomething($et, $tagTbl, $sampleTime);
2294
- $et->HandleTag($tagTbl, GPSDateTime => $time);
2295
- $et->HandleTag($tagTbl, GPSLatitude => $lat * ($latRef eq 'S' ? -1 : 1));
2296
- $et->HandleTag($tagTbl, GPSLongitude => $lon * ($lonRef eq 'W' ? -1 : 1));
2297
- if (defined $spd) {
2298
- $et->HandleTag($tagTbl, GPSSpeed => $spd);
2299
- $et->HandleTag($tagTbl, GPSSpeedRef => 'K');
2277
+ my ($rtnVal, %fix);
2278
+ # parse only RMC and GGA sentence [with leading timecode] for now
2279
+ for (;;) {
2280
+ my ($tc, $type, $tim);
2281
+ if ($$dataPt =~ /(?:\[(\d+)\])?\$[A-Z]{2}(RMC|GGA),(\d{2}\d{2}\d+(\.\d*)?),/g) {
2282
+ ($tc, $type, $tim) = ($1, $2, $3);
2300
2283
  }
2301
- if (defined $trk) {
2302
- $et->HandleTag($tagTbl, GPSTrack => $trk);
2303
- $et->HandleTag($tagTbl, GPSTrackRef => 'T');
2284
+ # write out last fix now if complete
2285
+ # (use the GPS timestamps because they may be different for the same timecode)
2286
+ if ($fix{tim} and (not $tim or $fix{tim} != $tim)) {
2287
+ if ($fix{dat} and defined $fix{lat} and defined $fix{lon}) {
2288
+ my $sampleTime;
2289
+ $sampleTime = ($fix{tc} - $$et{StartTime}) / 1000 if $fix{tc} and $$et{StartTime};
2290
+ FoundSomething($et, $tagTbl, $sampleTime);
2291
+ $et->HandleTag($tagTbl, GPSDateTime => $fix{dat});
2292
+ $et->HandleTag($tagTbl, GPSLatitude => $fix{lat});
2293
+ $et->HandleTag($tagTbl, GPSLongitude => $fix{lon});
2294
+ if (defined $fix{spd}) {
2295
+ $et->HandleTag($tagTbl, GPSSpeed => $fix{spd} * $knotsToKph);
2296
+ $et->HandleTag($tagTbl, GPSSpeedRef => 'K');
2297
+ }
2298
+ if (defined $fix{trk}) {
2299
+ $et->HandleTag($tagTbl, GPSTrack => $fix{trk});
2300
+ $et->HandleTag($tagTbl, GPSTrackRef => 'T');
2301
+ }
2302
+ $et->HandleTag($tagTbl, GPSAltitude => $fix{alt}) if defined $fix{alt};
2303
+ $et->HandleTag($tagTbl, GPSSatellites => $fix{nsats}+0) if defined $fix{nsats};
2304
+ $et->HandleTag($tagTbl, GPSDOP => $fix{hdop}) if defined $fix{hdop};
2305
+ }
2306
+ undef %fix;
2307
+ }
2308
+ $fix{tim} = $tim or last;
2309
+ my $pos = pos($$dataPt);
2310
+ pos($$dataPt) = $pos - length($tim) - 1; # rewind to re-parse time
2311
+ # (parsing of NMEA strings copied from Geotag.pm)
2312
+ if ($type eq 'RMC' and
2313
+ $$dataPt =~ /\G(\d{2})(\d{2})(\d+(\.\d*)?),A?,(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),(\d*\.?\d*),(\d*\.?\d*),(\d{2})(\d{2})(\d+)/g)
2314
+ {
2315
+ my $year = $15 + ($15 >= 70 ? 1900 : 2000);
2316
+ $fix{tc} = $tc; # use timecode of RMC sentence
2317
+ $fix{dat} = sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%sZ',$year,$14,$13,$1,$2,$3);
2318
+ $fix{lat} = (($5 || 0) + $6/60) * ($7 eq 'N' ? 1 : -1);
2319
+ $fix{lon} = (($8 || 0) + $9/60) * ($10 eq 'E' ? 1 : -1);
2320
+ $fix{spd} = $11 if length $11;
2321
+ $fix{trk} = $12 if length $12;
2322
+ } elsif ($type eq 'GGA' and
2323
+ $$dataPt =~ /\G(\d{2})(\d{2})(\d+(\.\d*)?),(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),[1-6]?,(\d+)?,(\.\d+|\d+\.?\d*)?,(-?\d+\.?\d*)?,M?/g)
2324
+ {
2325
+ $fix{lat} = (($5 || 0) + $6/60) * ($7 eq 'N' ? 1 : -1);
2326
+ $fix{lon} = (($8 || 0) + $9/60) * ($10 eq 'E' ? 1 : -1);
2327
+ @fix{qw(nsats hdop alt)} = ($11,$12,$13);
2328
+ } else {
2329
+ pos($$dataPt) = $pos; # continue searching from our last match
2304
2330
  }
2305
2331
  }
2306
2332
  delete $$et{DOC_NUM};
2307
- return 1;
2333
+ return $rtnVal;
2334
+ }
2335
+
2336
+ #------------------------------------------------------------------------------
2337
+ # Process 'gps ' or 'udat' atom possibly containing NMEA (ref PH)
2338
+ # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
2339
+ # Returns: 1 on success
2340
+ sub ProcessGPSLog($$$)
2341
+ {
2342
+ my ($et, $dirInfo, $tagTbl) = @_;
2343
+ my $dataPt = $$dirInfo{DataPt};
2344
+ my ($rtnVal, @a);
2345
+
2346
+ # try NMEA format first
2347
+ return 1 if ProcessNMEA($et,$dirInfo,$tagTbl);
2348
+
2349
+ # DENVER ACG-8050WMK2 format looks like this:
2350
+ # 210318073213[1][N][52200970][E][006362321][+00152][100][00140][C000000]+000+000+000+000+000+000+000+000+000+000+000+000+000+000+000+000+000+000
2351
+ # YYMMDDHHMMSS A? NS lat EW lon alt kph dir kCal accel
2352
+ while ($$dataPt =~ /\b(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})\[1\]\[([NS])\]\[(\d{8})\]\[([EW])\]\[(\d{9})\]\[([-+]?\d*)\]\[(\d*)\]\[(\d*)\]\[C?(\d*)\](([-+]\d{3})+)/g) {
2353
+ my $lat = substr( $8,0,2) + substr( $8,2) / 600000;
2354
+ my $lon = substr($10,0,3) + substr($10,3) / 600000;
2355
+ $$et{DOC_NUM} = ++$$et{DOC_COUNT};
2356
+ $et->HandleTag($tagTbl, GPSDateTime => "20$1:$2:$3 $4:$5:$6Z");
2357
+ $et->HandleTag($tagTbl, GPSLatitude => $lat * ($7 eq 'S' ? -1 : 1));
2358
+ $et->HandleTag($tagTbl, GPSLongitude => $lon * ($9 eq 'W' ? -1 : 1));
2359
+ $et->HandleTag($tagTbl, GPSAltitude => $11 / 10) if length $11;
2360
+ $et->HandleTag($tagTbl, GPSSpeed => $12 + 0) if length $12;
2361
+ $et->HandleTag($tagTbl, GPSTrack => $13 + 0) if length $13;
2362
+ $et->HandleTag($tagTbl, KiloCalories => $14 / 10) if length $14;
2363
+ $et->HandleTag($tagTbl, Accelerometer=> $15) if length $15;
2364
+ $rtnVal = 1;
2365
+ }
2366
+ delete $$et{DOC_NUM};
2367
+ return $rtnVal;
2308
2368
  }
2309
2369
 
2310
2370
  #------------------------------------------------------------------------------
@@ -62,10 +62,11 @@ key:
62
62
  information about the source directory for tags to be copied to the output.
63
63
 
64
64
  CHECK_PROC : Reference to a function which validates Raw values for writing.
65
- The function takes three arguments: 0) ExifTool object reference, 1) tagInfo
66
- reference, 2) value reference, and returns undefined (and possibly modifies
67
- the input value) if successful, or an error message if there was a format
68
- problem. May set ExifTool CHECK_WARN datamember for success with a warning.
65
+ The function takes 3-4 arguments: 0) ExifTool object reference, 1) tagInfo
66
+ reference, 2) value reference, and 3) [optional] conversion type. It returns
67
+ undefined (and possibly modifies the input value) if successful, or an error
68
+ message if there was a format problem. May set ExifTool CHECK_WARN datamember
69
+ for success with a warning.
69
70
 
70
71
  INIT_TABLE : Routine called to do any necessary initialization before the
71
72
  first time the table is loaded. Argument is a reference to the table.
@@ -21,6 +21,7 @@
21
21
  # 13) http://tech.ebu.ch/docs/tech/tech3285.pdf
22
22
  # 14) https://developers.google.com/speed/webp/docs/riff_container
23
23
  # 15) https://tech.ebu.ch/docs/tech/tech3306-2009.pdf
24
+ # 16) https://sites.google.com/site/musicgapi/technical-documents/wav-file-format
24
25
  #------------------------------------------------------------------------------
25
26
 
26
27
  package Image::ExifTool::RIFF;
@@ -29,7 +30,7 @@ use strict;
29
30
  use vars qw($VERSION);
30
31
  use Image::ExifTool qw(:DataAccess :Utils);
31
32
 
32
- $VERSION = '1.56';
33
+ $VERSION = '1.58';
33
34
 
34
35
  sub ConvertTimecode($);
35
36
  sub ProcessSGLT($$$);
@@ -354,9 +355,35 @@ my %code2charset = (
354
355
  SubDirectory => { TagTable => 'Image::ExifTool::RIFF::DS64' },
355
356
  },
356
357
  list => 'ListType', #15
357
- labl => { #15
358
- Name => 'Label',
359
- SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Label' },
358
+ labl => { #16 (in 'adtl' chunk)
359
+ Name => 'CuePointLabel',
360
+ Priority => 0, # (so they are stored in sequence)
361
+ ValueConv => 'my $str=substr($val,4); $str=~s/\0+$//; unpack("V",$val) . " " . $str',
362
+ },
363
+ note => { #16 (in 'adtl' chunk)
364
+ Name => 'CuePointNote',
365
+ Priority => 0, # (so they are stored in sequence)
366
+ ValueConv => 'my $str=substr($val,4); $str=~s/\0+$//; unpack("V",$val) . " " . $str',
367
+ },
368
+ ltxt => { #16 (in 'adtl' chunk)
369
+ Name => 'LabeledText',
370
+ Notes => 'CuePointID Length Purpose Country Language Dialect Codepage Text',
371
+ Priority => 0, # (so they are stored in sequence)
372
+ ValueConv => q{
373
+ my @a = unpack('VVa4vvvv', $val);
374
+ $a[2] = "'$a[2]'";
375
+ my $txt = substr($val, 18);
376
+ $txt =~ s/\0+$//; # remove null terminator
377
+ return join(' ', @a, $txt);
378
+ },
379
+ },
380
+ smpl => { #16
381
+ Name => 'Sampler',
382
+ SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Sampler' },
383
+ },
384
+ inst => { #16
385
+ Name => 'Instrument',
386
+ SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Instrument' },
360
387
  },
361
388
  LIST_INFO => {
362
389
  Name => 'Info',
@@ -396,6 +423,10 @@ my %code2charset = (
396
423
  ProcessProc => \&Image::ExifTool::RIFF::ProcessChunks,
397
424
  },
398
425
  },
426
+ LIST_adtl => { #PH (ref 16, forum12387)
427
+ Name => 'AssociatedDataList',
428
+ SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Main' },
429
+ },
399
430
  # seen LIST_JUNK
400
431
  JUNK => [
401
432
  {
@@ -466,10 +497,15 @@ my %code2charset = (
466
497
  Name => 'NumberOfSamples',
467
498
  RawConv => 'Get32u(\$val, 0)',
468
499
  },
469
- 'cue ' => {
500
+ 'cue '=> {
470
501
  Name => 'CuePoints',
471
502
  Binary => 1,
503
+ Notes => q{
504
+ config_files/cutepointlist.config from full distribution will decode this
505
+ and generate a list of cue points with labels
506
+ },
472
507
  },
508
+ plst => { Name => 'Playlist', Binary => 1 }, #16
473
509
  afsp => { },
474
510
  IDIT => {
475
511
  Name => 'DateTimeOriginal',
@@ -704,16 +740,52 @@ my %code2charset = (
704
740
  # very unlikely, support for these is not yet implemented)
705
741
  );
706
742
 
707
- # cue point labels (ref 15)
708
- %Image::ExifTool::RIFF::Label = (
743
+ # Sampler chunk (ref 16)
744
+ %Image::ExifTool::RIFF::Sampler = (
709
745
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
710
746
  GROUPS => { 2 => 'Audio' },
711
747
  FORMAT => 'int32u',
712
- 0 => 'LabelID',
713
- 1 => {
714
- Name => 'LabelText',
715
- Format => 'string[$size-4]',
748
+ 0 => 'Manufacturer',
749
+ 1 => 'Product',
750
+ 2 => 'SamplePeriod',
751
+ 3 => 'MIDIUnityNote',
752
+ 4 => 'MIDIPitchFraction',
753
+ 5 => {
754
+ Name => 'SMPTEFormat',
755
+ PrintConv => {
756
+ 0 => 'none',
757
+ 24 => '24 fps',
758
+ 25 => '25 fps',
759
+ 29 => '29 fps',
760
+ 30 => '30 fps',
761
+ },
716
762
  },
763
+ 6 => {
764
+ Name => 'SMPTEOffset',
765
+ Notes => 'HH:MM:SS:FF',
766
+ ValueConv => q{
767
+ my $str = sprintf('%.8x', $val);
768
+ $str =~ s/(..)(..)(..)(..)/$1:$2:$3:$4/;
769
+ return $str;
770
+ },
771
+ },
772
+ 7 => 'NumSampleLoops',
773
+ 8 => 'SamplerDataLen',
774
+ 9 => { Name => 'SamplerData', Format => 'undef[$size-40]', Binary => 1 },
775
+ );
776
+
777
+ # Instrument chunk (ref 16)
778
+ %Image::ExifTool::RIFF::Instrument = (
779
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
780
+ GROUPS => { 2 => 'Audio' },
781
+ FORMAT => 'int8s',
782
+ 0 => 'UnshiftedNote',
783
+ 1 => 'FineTune',
784
+ 2 => 'Gain',
785
+ 3 => 'LowNote',
786
+ 4 => 'HighNote',
787
+ 5 => 'LowVelocity',
788
+ 6 => 'HighVelocity',
717
789
  );
718
790
 
719
791
  # Sub chunks of INFO LIST chunk
@@ -1892,7 +1964,7 @@ sub ProcessRIFF($$)
1892
1964
  $$et{DOC_NUM} = ++$$et{DOC_COUNT};
1893
1965
  }
1894
1966
  my $tagInfo = $$tagTbl{$tag};
1895
- if ($tagInfo or (($verbose or $unknown) and $tag !~ /^(data|idx1|LIST_movi|RIFF)$/)) {
1967
+ if ($tagInfo or (($verbose or $unknown) and $tag !~ /^(data|idx1|LIST_movi|RIFF|\d{2}(db|dc|wb))$/)) {
1896
1968
  $raf->Read($buff, $len2) == $len2 or $err=1, last;
1897
1969
  my $setGroups;
1898
1970
  if ($tagInfo and ref $tagInfo eq 'HASH' and $$tagInfo{SetGroups}) {
@@ -22,7 +22,7 @@ use vars qw($VERSION %samsungLensTypes);
22
22
  use Image::ExifTool qw(:DataAccess :Utils);
23
23
  use Image::ExifTool::Exif;
24
24
 
25
- $VERSION = '1.48';
25
+ $VERSION = '1.49';
26
26
 
27
27
  sub WriteSTMN($$$);
28
28
  sub ProcessINFO($$$);
@@ -940,6 +940,7 @@ my %formatMinMax = (
940
940
  %Image::ExifTool::Samsung::Trailer = (
941
941
  GROUPS => { 0 => 'MakerNotes', 2 => 'Other' },
942
942
  VARS => { NO_ID => 1, HEX_ID => 0 },
943
+ PRIORITY => 0, # (first one takes priority so DepthMapWidth/Height match first DepthMapData)
943
944
  NOTES => q{
944
945
  Tags extracted from the trailer of JPEG images written when using certain
945
946
  features (such as "Sound & Shot" or "Shot & More") from Samsung models such
@@ -265,6 +265,15 @@ $VERSION = '1.65';
265
265
  'XMP',
266
266
  'ZoomedPreviewImage',
267
267
  ],
268
+ 'ls-l' => [
269
+ 'FilePermissions',
270
+ 'FileHardLinks',
271
+ 'FileUserID',
272
+ 'FileGroupID',
273
+ 'FileSize#',
274
+ 'FileModifyDate',
275
+ 'FileName',
276
+ ],
268
277
  );
269
278
 
270
279
  #------------------------------------------------------------------------------
@@ -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.35';
37
+ $VERSION = '3.41';
38
38
 
39
39
  sub ProcessSRF($$$);
40
40
  sub ProcessSR2($$$);
@@ -71,8 +71,8 @@ sub PrintInvLensSpec($;$$);
71
71
  '0.12' => 'Zeiss Loxia 35mm F2', # (firmware Ver.01)
72
72
  1 => 'Sony LA-EA1 or Sigma MC-11 Adapter', # MC-11 with not-supported lenses
73
73
  2 => 'Sony LA-EA2 Adapter',
74
- 3 => 'Sony LA-EA3 Adapter', #(NC) ILCE-7 image with A-mount lens, but also has 0x940e 2nd byte=2
75
- 6 => 'Sony LA-EA4 Adapter', #(NC) ILCE-7R image with A-mount lens and having phase-detect info blocks in 0x940e AFInfo
74
+ 3 => 'Sony LA-EA3 Adapter',
75
+ 6 => 'Sony LA-EA4 Adapter',
76
76
  7 => 'Sony LA-EA5 Adapter', #JR
77
77
  # 27 => Venus Optics Laowa 12mm f2.8 Zero-D or 105mm f2 (T3.2) Smooth Trans Focus (ref IB)
78
78
  44 => 'Metabones Canon EF Smart Adapter', #JR
@@ -80,6 +80,7 @@ sub PrintInvLensSpec($;$$);
80
80
  184 => 'Metabones Canon EF Speed Booster Ultra', #JR ('Green' mode, LensMount reported as A-mount)
81
81
  234 => 'Metabones Canon EF Smart Adapter Mark IV', #JR (LensMount reported as A-mount)
82
82
  239 => 'Metabones Canon EF Speed Booster', #JR
83
+ 24593 => 'LA-EA4r MonsterAdapter',
83
84
  # Sony VX product code: (http://www.mi-fo.de/forum/index.php?s=7df1c8d3b1cd675f2abf4f4442e19cf2&showtopic=35035&view=findpost&p=303746)
84
85
  32784 => 'Sony E 16mm F2.8', # VX9100
85
86
  32785 => 'Sony E 18-55mm F3.5-5.6 OSS', # VX9101
@@ -142,11 +143,17 @@ sub PrintInvLensSpec($;$$);
142
143
  32852 => 'Sony FE 600mm F4 GM OSS', #IB
143
144
  32853 => 'Sony E 16-55mm F2.8 G', #IB/JR
144
145
  32854 => 'Sony E 70-350mm F4.5-6.3 G OSS', #IB/JR
146
+ 32855 => 'Sony FE C 16-35mm T3.1 G', #JR (SELC1635G) (max aperture is 2.8)
145
147
  32858 => 'Sony FE 35mm F1.8', #JR/IB
146
148
  32859 => 'Sony FE 20mm F1.8 G', #IB/JR
147
149
  32860 => 'Sony FE 12-24mm F2.8 GM', #JR/IB
150
+ 32862 => 'Sony FE 50mm F1.2 GM', #IB/JR
151
+ 32863 => 'Sony FE 14mm F1.8 GM', #IB
148
152
  32864 => 'Sony FE 28-60mm F4-5.6', #JR
149
153
  32865 => 'Sony FE 35mm F1.4 GM', #IB/JR
154
+ 32866 => 'Sony FE 24mm F2.8 G', #IB
155
+ 32867 => 'Sony FE 40mm F2.5 G', #IB
156
+ 32868 => 'Sony FE 50mm F2.5 G', #IB
150
157
 
151
158
  # (comment this out so LensID will report the LensModel, which is more useful)
152
159
  # 32952 => 'Metabones Canon EF Speed Booster Ultra', #JR (corresponds to 184, but 'Advanced' mode, LensMount reported as E-mount)
@@ -187,7 +194,9 @@ sub PrintInvLensSpec($;$$);
187
194
  49463 => 'Tamron 28-200mm F2.8-5.6 Di III RXD', #JR (Model A071)
188
195
  49464 => 'Tamron 70-300mm F4.5-6.3 Di III RXD', #JR (Model A047)
189
196
  49465 => 'Tamron 17-70mm F2.8 Di III-A VC RXD', #JR (Model B070)
190
- 49473 => 'Tokina atx-m 85mm F1.8 FE', #JR
197
+ 49473 => 'Tokina atx-m 85mm F1.8 FE or Viltrox lens', #JR
198
+ 49473.1 => 'Viltrox 23mm F1.4 E', #JR
199
+ 49473.2 => 'Viltrox 56mm F1.4 E', #JR
191
200
  49712 => 'Tokina FiRIN 20mm F2 FE AF', # (firmware Ver.01)
192
201
  49713 => 'Tokina FiRIN 100mm F2.8 FE MACRO', # (firmware Ver.01)
193
202
 
@@ -221,6 +230,8 @@ sub PrintInvLensSpec($;$$);
221
230
  50522 => 'Sigma 105mm F2.8 DG DN MACRO | A', #JR (020)
222
231
  50523 => 'Sigma 65mm F2 DG DN | C', #IB (020)
223
232
  50524 => 'Sigma 35mm F2 DG DN | C', #IB (020)
233
+ 50525 => 'Sigma 24mm F3.5 DG DN | C', #JR (021)
234
+ 50526 => 'Sigma 28-70mm F2.8 DG DN | C', #JR (021)
224
235
 
225
236
  50992 => 'Voigtlander SUPER WIDE-HELIAR 15mm F4.5 III', #JR
226
237
  50993 => 'Voigtlander HELIAR-HYPER WIDE 10mm F5.6', #IB
@@ -623,9 +634,10 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
623
634
  3 => 'Standard',
624
635
  4 => 'Economy',
625
636
  5 => 'Extra Fine',
626
- 6 => 'RAW + JPEG',
637
+ 6 => 'RAW + JPEG/HEIF',
627
638
  7 => 'Compressed RAW',
628
639
  8 => 'Compressed RAW + JPEG',
640
+ 9 => 'Light', #JR
629
641
  0xffffffff => 'n/a', #PH (SLT-A57 panorama)
630
642
  },
631
643
  },
@@ -1118,7 +1130,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1118
1130
  },
1119
1131
  },{
1120
1132
  Name => 'AFAreaModeSetting',
1121
- Condition => '$$self{Model} =~ /^(NEX-|ILCE-|DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX99|RX0M2))/',
1133
+ Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-|DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX99|RX0M2))/',
1122
1134
  Notes => 'NEX, ILCE and some DSC models',
1123
1135
  RawConv => '$$self{AFAreaILCE} = $val',
1124
1136
  DataMember => 'AFAreaILCE',
@@ -1154,7 +1166,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1154
1166
  # observed values in range (0 0) to (640 480), with center (320 240) often seen
1155
1167
  # for NEX-5R/6, positions appear to be in an 11x9 grid
1156
1168
  Name => 'FlexibleSpotPosition',
1157
- Condition => '$$self{Model} =~ /^(NEX-|ILCE-|DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX99|RX0M2))/',
1169
+ Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-|DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX99|RX0M2))/',
1158
1170
  Writable => 'int16u',
1159
1171
  Count => 2,
1160
1172
  Notes => q{
@@ -1169,7 +1181,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1169
1181
  # doesn't seem to apply to DSC models (always 0)
1170
1182
  Name => 'AFPointSelected',
1171
1183
  Condition => q{
1172
- ($$self{Model} =~ /^(SLT-|HV)/) or ($$self{Model} =~ /^ILCE-/ and
1184
+ ($$self{Model} =~ /^(SLT-|HV)/) or ($$self{Model} =~ /^(ILCE-|ILME-)/ and
1173
1185
  defined $$self{AFAreaILCE} and $$self{AFAreaILCE} == 4)
1174
1186
  },
1175
1187
  Notes => 'SLT models or ILCE with LA-EA2/EA4',
@@ -1247,7 +1259,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1247
1259
  Name => 'AFPointSelected',
1248
1260
  # non-zero only when AFAreaMode is 'Zone', and 'Expanded-Flexible-Spot' for ILCE-6300/7RM2/7SM2
1249
1261
  # each Zone has 3x3 AF Areas --> 9 positions within 5x5 total Contrast AF Areas
1250
- Condition => '$$self{Model} =~ /^(NEX-|ILCE-)/',
1262
+ Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-)/',
1251
1263
  Notes => 'NEX and ILCE models',
1252
1264
  Writable => 'int8u',
1253
1265
  PrintConv => {
@@ -1404,6 +1416,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1404
1416
  PrintConv => {
1405
1417
  0 => 'Compressed RAW',
1406
1418
  1 => 'Uncompressed RAW',
1419
+ 2 => 'Lossless Compressed RAW', #JR (NC) seen for ILCE-1
1407
1420
  65535 => 'n/a', # seen for ILCE-7SM3 JPEG-only
1408
1421
  },
1409
1422
  },
@@ -1451,13 +1464,15 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1451
1464
  Count => 2,
1452
1465
  PrintConv => {
1453
1466
  '0 0' => 'n/a',
1454
- '0 1' => 'Standard JPEG',
1455
- '0 2' => 'Fine JPEG',
1456
- '0 3' => 'Extra Fine JPEG',
1467
+ '0 1' => 'Standard',
1468
+ '0 2' => 'Fine',
1469
+ '0 3' => 'Extra Fine',
1470
+ '0 4' => 'Light', #JR
1457
1471
  '1 0' => 'RAW',
1458
- '1 1' => 'RAW + Standard JPEG',
1459
- '1 2' => 'RAW + Fine JPEG',
1460
- '1 3' => 'RAW + Extra Fine JPEG',
1472
+ '1 1' => 'RAW + Standard',
1473
+ '1 2' => 'RAW + Fine',
1474
+ '1 3' => 'RAW + Extra Fine',
1475
+ '1 4' => 'RAW + Light', #JR
1461
1476
  },
1462
1477
  },
1463
1478
  0x202f => { #JR (ILCE-7RM3)
@@ -1503,13 +1518,57 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1503
1518
  PrintConv => 'sprintf("%.8d",$val)',
1504
1519
  PrintConvInv => '$val',
1505
1520
  },
1506
- # 0x2032 - first seen for ILCE-7SM3, July 2020
1507
- # 0x2033 - first seen for ILCE-7SM3, July 2020
1508
- # 0x2034 - first seen for ILCE-7SM3, July 2020
1509
- # 0x2035 - first seen for ILCE-7SM3, July 2020
1510
- # 0x2036 - first seen for ILCE-7SM3, July 2020
1511
- # 0x2037 - first seen for ILCE-7SM3, July 2020
1512
- # 0x2039 - first seen for ILCE-7SM3, July 2020
1521
+ # 0x2032 - 0x2039: from July 2020 for ILCE-7SM3, ILCE-1, ILME-FX3 and newer
1522
+ 0x2032 => {
1523
+ Name => 'Shadows',
1524
+ Writable => 'int32s',
1525
+ PrintConv => '$val > 0 ? "+$val" : $val',
1526
+ PrintConvInv => '$val',
1527
+ },
1528
+ 0x2033 => {
1529
+ Name => 'Highlights',
1530
+ Writable => 'int32s',
1531
+ PrintConv => '$val > 0 ? "+$val" : $val',
1532
+ PrintConvInv => '$val',
1533
+ },
1534
+ 0x2034 => {
1535
+ Name => 'Fade',
1536
+ Writable => 'int32s',
1537
+ PrintConv => '$val > 0 ? "+$val" : $val',
1538
+ PrintConvInv => '$val',
1539
+ },
1540
+ 0x2035 => {
1541
+ Name => 'SharpnessRange',
1542
+ Writable => 'int32s',
1543
+ PrintConv => '$val > 0 ? "+$val" : $val',
1544
+ PrintConvInv => '$val',
1545
+ },
1546
+ 0x2036 => {
1547
+ Name => 'Clarity',
1548
+ Writable => 'int32s',
1549
+ PrintConv => '$val > 0 ? "+$val" : $val',
1550
+ PrintConvInv => '$val',
1551
+ },
1552
+ 0x2037 => {
1553
+ Name => 'FocusFrameSize',
1554
+ Format => 'int16u',
1555
+ Count => '3',
1556
+ Notes => 'width and height of FocusFrame, centered on FocusLocation',
1557
+ PrintConv => q{
1558
+ my @a = split ' ', $val;
1559
+ return $a[2] ? sprintf('%3dx%3d', $a[0], $a[1]) : 'n/a';
1560
+ },
1561
+ PrintConvInv => '$val =~ /(\d+)x(\d+)/ ? "$1 $2 257" : "0 0 0"',
1562
+ },
1563
+ 0x2039 => { #JR
1564
+ Name => 'JPEG-HEIFSwitch', # (name used in camera menus)
1565
+ Writable => 'int16u',
1566
+ PrintConv => {
1567
+ 0 => 'JPEG',
1568
+ 1 => 'HEIF',
1569
+ 65535 => 'n/a',
1570
+ },
1571
+ },
1513
1572
  0x3000 => {
1514
1573
  Name => 'ShotInfo',
1515
1574
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::ShotInfo' },
@@ -1538,7 +1597,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1538
1597
  # from mid-2015: ILCE-7RM2/7SM2/6300 and newer models use different offsets
1539
1598
  {
1540
1599
  Name => 'Tag9050a',
1541
- Condition => '$$self{Model} !~ /^(DSC-|Stellar|ILCE-(6100|6300|6400|6500|6600|7C|7M3|7RM2|7RM3|7RM4|7SM2|7SM3|9|9M2)|ILCA-99M2|ZV-)/',
1600
+ Condition => '$$self{Model} !~ /^(DSC-|Stellar|ILCE-(1|6100|6300|6400|6500|6600|7C|7M3|7RM2|7RM3|7RM4|7SM2|7SM3|9|9M2)|ILCA-99M2|ILME-FX3|ZV-)/',
1542
1601
  SubDirectory => {
1543
1602
  TagTable => 'Image::ExifTool::Sony::Tag9050a',
1544
1603
  ByteOrder => 'LittleEndian',
@@ -1552,7 +1611,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1552
1611
  },
1553
1612
  },{
1554
1613
  Name => 'Tag9050c',
1555
- Condition => '$$self{Model} =~ /^(ILCE-7SM3)/',
1614
+ Condition => '$$self{Model} =~ /^(ILCE-(1|7SM3)|ILME-FX3)/',
1556
1615
  SubDirectory => {
1557
1616
  TagTable => 'Image::ExifTool::Sony::Tag9050c',
1558
1617
  ByteOrder => 'LittleEndian',
@@ -1572,8 +1631,8 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1572
1631
  # 0x24 (e) for ILCA-99M2,ILCE-5100/6300/6500/7M2/7RM2/7S/7SM2/QX1, DSC-HX80/HX90V/QX30/RX0/RX100M3/RX100M4/RX100M5/RX10M2/RX10M3/RX1RM2/WX500
1573
1632
  # 0x26 (e) for ILCE-6100/6400/6600/7M3/7RM3/9, DSC-RX0M2/RX10M4/RX100M5A/RX100M6/HX99
1574
1633
  # 0x28 (e) for ILCE-7RM4/9M2, DSC-RX100M7, ZV-1
1575
- # 0x31 (e) for ILCE-7SM3
1576
- # first byte decoded: 40, 204, 202, 27, 58, 62, 48, 215, 28 respectively
1634
+ # 0x31 (e) for ILCE-1/7SM3, ILME-FX3
1635
+ # first byte decoded: 40, 204, 202, 27, 58, 62, 48, 215, 28, 106 respectively
1577
1636
  {
1578
1637
  Name => 'Tag9400a',
1579
1638
  Condition => q{
@@ -1800,7 +1859,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1800
1859
  },
1801
1860
  0x940c => [{
1802
1861
  Name => 'Tag940c',
1803
- Condition => '$$self{Model} =~ /^(NEX-|ILCE-|Lunar)\b/',
1862
+ Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-|Lunar)\b/',
1804
1863
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag940c' },
1805
1864
  },{
1806
1865
  Name => 'Sony_0x940c',
@@ -1957,6 +2016,8 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1957
2016
  380 => 'ZV-1', #JR
1958
2017
  381 => 'ILCE-7C', #JR
1959
2018
  383 => 'ILCE-7SM3',
2019
+ 384 => 'ILCE-1', #PH
2020
+ 385 => 'ILME-FX3', #JR
1960
2021
  },
1961
2022
  },
1962
2023
  0xb020 => { #2
@@ -6067,6 +6128,10 @@ my %pictureProfile2010 = (
6067
6128
  31 => 'Gamma S-Log3 (PP8 or PP9)', #14
6068
6129
  33 => 'Gamma HLG2 (PP10)', #14
6069
6130
  34 => 'Gamma HLG3', #IB
6131
+ 37 => 'FL',
6132
+ 38 => 'VV2',
6133
+ 39 => 'IN',
6134
+ 40 => 'SH',
6070
6135
  },
6071
6136
  );
6072
6137
  my %isoSetting2010 = (
@@ -7788,7 +7853,7 @@ my %isoSetting2010 = (
7788
7853
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
7789
7854
  FORMAT => 'int8u',
7790
7855
  NOTES => q{
7791
- Valid from July 2020 for ILCE-7SM3.
7856
+ Valid from July 2020 for ILCE-1/7SM3, ILME-FX3.
7792
7857
  },
7793
7858
  WRITABLE => 1,
7794
7859
  FIRST_ENTRY => 0,
@@ -7849,13 +7914,12 @@ my %isoSetting2010 = (
7849
7914
  },
7850
7915
  0x0050 => {
7851
7916
  Name => 'ShutterCount2',
7852
- Condition => '(($$self{FlashFired} & 0x01) != 1) and ($$self{Model} =~ /^(ILCE-7SM3)/)',
7917
+ Condition => '($$self{FlashFired} & 0x01) != 1',
7853
7918
  Format => 'int32u',
7854
7919
  RawConv => '$val & 0x00ffffff',
7855
7920
  },
7856
7921
  0x0066 => { # appr. same value as Exif ExposureTime, but not valid in HDR-modes
7857
7922
  Name => 'SonyExposureTime',
7858
- Condition => '$$self{Model} =~ /^(ILCE-7SM3)/',
7859
7923
  Format => 'int16u',
7860
7924
  ValueConv => '$val ? 2 ** (16 - $val/256) : 0',
7861
7925
  ValueConvInv => '$val ? int((16 - log($val) / log(2)) * 256 + 0.5) : 0',
@@ -7864,7 +7928,6 @@ my %isoSetting2010 = (
7864
7928
  },
7865
7929
  0x0068 => { # appr. same value as Exif ExposureTime, but not valid in HDR-modes
7866
7930
  Name => 'SonyFNumber',
7867
- Condition => '$$self{Model} =~ /^(ILCE-7SM3)/',
7868
7931
  Format => 'int16u',
7869
7932
  ValueConv => '2 ** (($val/256 - 16) / 2)',
7870
7933
  ValueConvInv => '(log($val)*2/log(2)+16)*256',
@@ -7873,11 +7936,17 @@ my %isoSetting2010 = (
7873
7936
  },
7874
7937
  0x006b => {
7875
7938
  Name => 'ReleaseMode2',
7876
- Condition => '$$self{Model} =~ /^(ILCE-7SM3)/',
7877
7939
  %releaseMode2,
7878
7940
  },
7879
7941
  0x0088 => {
7880
7942
  Name => 'InternalSerialNumber', #(NC)
7943
+ Condition => '$$self{Model} =~ /^(ILCE-7SM3|ILME-FX3)/',
7944
+ Format => 'int8u[6]',
7945
+ PrintConv => 'unpack "H*", pack "C*", split " ", $val',
7946
+ },
7947
+ 0x008a => {
7948
+ Name => 'InternalSerialNumber', #(NC)
7949
+ Condition => '$$self{Model} =~ /^(ILCE-1)/',
7881
7950
  Format => 'int8u[6]',
7882
7951
  PrintConv => 'unpack "H*", pack "C*", split " ", $val',
7883
7952
  },
@@ -8052,7 +8121,7 @@ my %isoSetting2010 = (
8052
8121
  NOTES => q{
8053
8122
  Valid for DSC-HX60V/HX80/HX90V/HX99/HX350/HX400V/QX30/RX0/RX1RM2/RX10/
8054
8123
  RX10M2/RX10M3/RX10M4/RX100M3/RX100M4/RX100M5/RX100M5A/RX100M6/RX100M7/WX220/
8055
- WX350/WX500, ILCE-7/7C/7R/7S/7M2/7M3/7RM2/7RM3/7RM4/7SM2/7SM3/9/9M2/5000/
8124
+ WX350/WX500, ILCE-1/7/7C/7R/7S/7M2/7M3/7RM2/7RM3/7RM4/7SM2/7SM3/9/9M2/5000/
8056
8125
  5100/6000/6100/6300/6400/6500/6600/QX1, ILCA-68/77M2/99M2.
8057
8126
  },
8058
8127
  FIRST_ENTRY => 0,
@@ -8107,25 +8176,35 @@ my %isoSetting2010 = (
8107
8176
  8 => 'Rotate 270 CW',
8108
8177
  },
8109
8178
  },
8110
- 0x002a => {
8179
+ 0x002a => [{
8111
8180
  Name => 'Quality2',
8112
- Condition => '$$self{Model} !~ /^(ILCE-7SM3)\b/',
8181
+ Condition => '$$self{Model} !~ /^(ILCE-(1|7SM3)|ILME-FX3)\b/',
8113
8182
  PrintConv => {
8114
8183
  0 => 'JPEG',
8115
8184
  1 => 'RAW',
8116
8185
  2 => 'RAW + JPEG',
8117
8186
  3 => 'JPEG + MPO', # 3D images
8118
8187
  },
8119
- },
8188
+ },{
8189
+ Name => 'Quality2',
8190
+ Condition => '$$self{Model} =~ /^(ILCE-(1|7SM3)|ILME-FX3)\b/',
8191
+ PrintConv => {
8192
+ 1 => 'JPEG',
8193
+ 2 => 'RAW',
8194
+ 3 => 'RAW + JPEG',
8195
+ 4 => 'HEIF',
8196
+ 6 => 'RAW + HEIF',
8197
+ },
8198
+ }],
8120
8199
  0x0047 => {
8121
8200
  Name => 'SonyImageHeight',
8122
- Condition => '$$self{Model} !~ /^(ILCE-7SM3)\b/',
8201
+ Condition => '$$self{Model} !~ /^(ILCE-(1|7SM3)|ILME-FX3)\b/',
8123
8202
  Format => 'int16u',
8124
8203
  PrintConv => '$val > 0 ? 8*$val : "n.a."',
8125
8204
  },
8126
8205
  0x0053 => {
8127
8206
  Name => 'ModelReleaseYear',
8128
- Condition => '$$self{Model} !~ /^(ILCE-7SM3)\b/',
8207
+ Condition => '$$self{Model} !~ /^(ILCE-(1|7SM3)|ILME-FX3)\b/',
8129
8208
  Format => 'int8u',
8130
8209
  PrintConv => 'sprintf("20%.2d", $val)',
8131
8210
  },
@@ -8144,7 +8223,7 @@ my %isoSetting2010 = (
8144
8223
  0x0000 => { Name => 'Ver9401', Hidden => 1, RawConv => '$$self{Ver9401} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val' },
8145
8224
 
8146
8225
  0x0498 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 148', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8147
- 0x04a1 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 160', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8226
+ 0x04a1 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(160|164)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8148
8227
  0x04a2 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(152|154|155)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8149
8228
  0x059d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(144|146)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8150
8229
  0x0634 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 68', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
@@ -8785,7 +8864,7 @@ my %isoSetting2010 = (
8785
8864
  FIRST_ENTRY => 0,
8786
8865
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
8787
8866
  DATAMEMBER => [ 0x0008 ],
8788
- NOTES => 'NEX and ILCE models only.',
8867
+ NOTES => 'E-mount cameras only.',
8789
8868
 
8790
8869
  # 0x0001 - 0 for all NEX and ILCE-3000/3500, 20 for all other ILCE (17 for ILCE samples from Sony.net)
8791
8870
  # 0x0008 - LensMount, but different values from Tag9405-0x0105 and Tag9050-0x0604.
@@ -8902,6 +8981,7 @@ my %isoSetting2010 = (
8902
8981
  # 1 0 0 0 for ILCE-5000/5100/6000/7/7M2/7R/7S/QX1
8903
8982
  # 6 0 0 0 for ILCE-6100/6300/6400/6500/6600/7C/7M3/7RM2/7RM3/7RM4/7SM2/9/9M2
8904
8983
  # 9 . . . for ILCE-7SM3
8984
+ # 11 . . . for ILCE-1
8905
8985
  # 0 2 0 0 for NEX/ILCE with LA-EA2/EA4 Phase-AF adapter
8906
8986
  # 2 0 0 0 seen for a few NEX-5N images
8907
8987
  # 2 2 0 0 seen for a few NEX-5N/7 images with LA-EA2 adapter
@@ -9411,7 +9491,7 @@ my %isoSetting2010 = (
9411
9491
  WRITE_PROC => \&WriteEnciphered,
9412
9492
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
9413
9493
  FORMAT => 'int8u',
9414
- NOTES => 'Valid for the ILCE-7SM3.',
9494
+ NOTES => 'Valid for the ILCE-1/7SM3, ILME-FX3.',
9415
9495
  FIRST_ENTRY => 0,
9416
9496
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
9417
9497
  0x0000 => { Name => 'Tag9416_0000', PrintConv => 'sprintf("%3d",$val)', RawConv => '$$self{TagVersion} = $val' },
@@ -10038,17 +10118,34 @@ my %isoSetting2010 = (
10038
10118
  0x3210 => { Name => 'Sony_rtmd_0x3210', Format => 'int8u', %hidUnk },
10039
10119
  0x3219 => { Name => 'Sony_rtmd_0x3219', Format => 'int8u', %hidUnk },
10040
10120
  0x321a => { Name => 'Sony_rtmd_0x321a', Format => 'int8u', %hidUnk },
10041
- 0x8000 => { Name => 'Sony_rtmd_0x8000', Format => 'int16u', %hidUnk },
10121
+ 0x8000 => { #forum12218
10122
+ Name => 'FNumber',
10123
+ Format => 'int16u',
10124
+ ValueConv => '2 ** (8-$val/8192)',
10125
+ PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
10126
+ },
10042
10127
  0x8001 => { Name => 'Sony_rtmd_0x8001', Format => 'int16u', %hidUnk },
10043
10128
  # 0x8100 - 16 bytes starting with 0x060e2b340401
10044
10129
  0x8100 => { Name => 'Sony_rtmd_0x8100', Format => 'int8u', %hidUnk },
10045
10130
  0x8101 => { Name => 'Sony_rtmd_0x8101', Format => 'int8u', %hidUnk }, # seen: 0,1
10046
10131
  0x8106 => { Name => 'Sony_rtmd_0x8106', Format => 'int32u', %hidUnk }, # seen: "25 1"
10047
- 0x8109 => { Name => 'Sony_rtmd_0x8109', Format => 'int32u', %hidUnk }, # seen: "1 50"
10048
- 0x810a => { Name => 'Sony_rtmd_0x810a', Format => 'int16u', %hidUnk }, # seen: 0
10049
- 0x810b => { Name => 'Sony_rtmd_0x810b', Format => 'int16u', %hidUnk }, # seen: 100
10050
- 0x810c => { Name => 'Sony_rtmd_0x810c', Format => 'int16u', %hidUnk }, # seen: 100
10051
- 0x810d => { Name => 'Sony_rtmd_0x810d', Format => 'int8u', %hidUnk }, # seen: 1
10132
+ 0x8109 => { #forum12218
10133
+ Name => 'ExposureTime',
10134
+ Format => 'rational64u',
10135
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
10136
+ },
10137
+ 0x810a => { #PH (NC, based on samples from forum12218)
10138
+ Name => 'MasterGainAdjustment',
10139
+ Format => 'int16u',
10140
+ ValueConv => '$val / 100',
10141
+ PrintConv => 'sprintf("%.2f dB", $val)',
10142
+ },
10143
+ 0x810b => { Name => 'ISO', Format => 'int16u' }, #forum12218
10144
+ 0x810c => { #PH (NC, based on samples from forum12218)
10145
+ Name => 'ElectricalExtenderMagnification',
10146
+ Format => 'int16u',
10147
+ },
10148
+ 0x810d => { Name => 'Sony_rtmd_0x810d', Format => 'int8u', %hidUnk }, # seen: 0,1
10052
10149
  0x8115 => { Name => 'Sony_rtmd_0x8115', Format => 'int16u', %hidUnk }, # seen: 100
10053
10150
  # 0x8300 - container for other tags in this format
10054
10151
  0x8500 => {
@@ -10127,9 +10224,20 @@ my %isoSetting2010 = (
10127
10224
  },
10128
10225
  0xe000 => { Name => 'Sony_rtmd_0xe000', Format => 'int8u', %hidUnk }, # (16 bytes)
10129
10226
  0xe300 => { Name => 'Sony_rtmd_0xe300', Format => 'int8u', %hidUnk }, # seen: 0,1
10130
- 0xe301 => { Name => 'Sony_rtmd_0xe301', Format => 'int32u', %hidUnk }, # seen: 100
10227
+ 0xe301 => { Name => 'Sony_rtmd_0xe301', Format => 'int32u', %hidUnk }, # seen: 100,1600
10131
10228
  0xe302 => { Name => 'Sony_rtmd_0xe302', Format => 'int8u', %hidUnk }, # seen: 1
10132
- 0xe303 => { Name => 'Sony_rtmd_0xe303', Format => 'int8u', %hidUnk }, # seen: 255
10229
+ 0xe303 => { #forum12218
10230
+ Name => 'WhiteBalance',
10231
+ Format => 'int8u',
10232
+ PrintConv => {
10233
+ 1 => 'Incandescent',
10234
+ 2 => 'Fluorescent',
10235
+ 4 => 'Daylight',
10236
+ 5 => 'Cloudy',
10237
+ 6 => 'Custom', # ("Shade" uses this value too)
10238
+ 255 => 'Preset',
10239
+ },
10240
+ },
10133
10241
  0xe304 => {
10134
10242
  Name => 'DateTime',
10135
10243
  Groups => { 2 => 'Time' },