exiftool_vendored 13.25.0 → 13.27.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b32fb55b43516b86b41460ed80654d3214bcee87257d0a90c614c40bb29fa16f
4
- data.tar.gz: 02d0ebd73cd108f256854da2ae9994f0e33fe2db0c84a3af5b76c6510d0d3e10
3
+ metadata.gz: fb0a184eb27a7f2bd365b24473d079bf59c21bfb5d18e4322438164364218151
4
+ data.tar.gz: 39f8672fe231f2d0588920382a7cc7b5d36199a03c7a86f43d0a0161ec5ba2f8
5
5
  SHA512:
6
- metadata.gz: 44f7894cac459290dbf545321f068ae903b2212abc5cd88ef399949bfa667511e01cbc9049b6329301a268a7daf4b4a5bb05c66625655010356b9bc895d23954
7
- data.tar.gz: 74d8a93399c703661ad4ed05d7f3a4748f994950be72be4b1237cb033a8c5b494ba9ce93a0bd79f9acae788afd74c8149e4ae3250b85d66d9bff18dd6209ec99
6
+ metadata.gz: 4c618366df0c65fff73241fe27a143eacb46a64280866edc3ba23f1b7fc8a5765d605029afd58fce678e080bdbd951989ab460336623afebee96ed1e0c61d891
7
+ data.tar.gz: 93d27263a8c922cea0bef3eec89779517dd040539cf9fae2e3712823fe5d48148ca86663ed469300b3677c1a99a3c9ccfc7564bbdd57150894682424db23621f
data/bin/Changes CHANGED
@@ -7,10 +7,35 @@ RSS feed: https://exiftool.org/rss.xml
7
7
  Note: The most recent production release is Version 13.25. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ Apr. 8, 2025 - Version 13.27
11
+
12
+ - Decode AF points for the Pentax K-3III
13
+ - Decode timed GPS from a variant of the Rove R2-4K dashcam
14
+ - Properly decode SensorTemperature for Pentax K3-III
15
+ - Patched PCAP test to avoid potential failure
16
+ - Patched to avoid potential "not a HASH reference" error when writing MOV/MP4
17
+ videos
18
+ - Fixed issue which could result in "uninitialized value" errors when reading
19
+ one type of timed GPS from MP4 videos
20
+ - Fixed problem writing MotionPhotoVideo in MP4 files
21
+
22
+ Mar. 31, 2025 - Version 13.26
23
+
24
+ - Added a new Olympus CameraType (thanks Herb)
25
+ - Added a new PentaxModelID (github #322)
26
+ - Added a new Nikon LensID
27
+ - Improved Duration calculation for some WAV files
28
+ - Changed a PCAP tag name and fixed typos in a few others (thanks blue-j)
29
+ - Patched to avoid VignettingCorr warning for images from some Canon cameras
30
+ - Patched to avoid some unnecessary duplicate tag warnings when -validate used
31
+ with HEIC images
32
+ - Fixed issue with XMP-xmpMM:Pantry items not exhibiting proper List-type
33
+ behaviour
34
+
10
35
  Mar. 11, 2025 - Version 13.25 (production release)
11
36
 
12
37
  - IMPORTANT: Fixed issue which could corrupt HEIC images from newer iPhones
13
- when writing QuickTime:Rotation
38
+ under certain conditions when writing QuickTime:Rotation
14
39
  - Decode more PLIST information from HEIC images
15
40
  - Updated Geolocation databases from current geonames.org files
16
41
  - Updated DarwinCore for the 2023 specification (thanks Herb)
@@ -25,7 +50,7 @@ Mar. 7, 2025 - Version 13.24
25
50
 
26
51
  Mar. 7, 2025 - Version 13.23
27
52
 
28
- - Added read support for CAP, PCAP and PACPNG files (github #318)
53
+ - Added read support for CAP, PCAP and PCAPNG files (github #318)
29
54
  - Added a number of new Sony LensType2 values (thanks Jos Roost)
30
55
  - Added the 2 new GPSAltitudeRef values defined by EXIF 3.0
31
56
  - Decode APP4 "Qualcomm Dual Camera Attributes" metadata
@@ -57,7 +82,7 @@ Feb. 20, 2025 - Version 13.21
57
82
  - Patched issue that could result in runtime warning for some video files
58
83
  - Fixed a bug with the new -plot option that could generate a compiler error
59
84
 
60
- Feb. 20, 2025 - Version 13.20
85
+ Feb. 20, 2025 - Version 13.20 - "SVG Plot"
61
86
 
62
87
  - Added new -plot option for generating SVG-format plots from tag values
63
88
  - Added a new Olympus CameraType
data/bin/META.json CHANGED
@@ -50,5 +50,5 @@
50
50
  }
51
51
  },
52
52
  "release_status" : "stable",
53
- "version" : "13.25"
53
+ "version" : "13.27"
54
54
  }
data/bin/META.yml CHANGED
@@ -31,4 +31,4 @@ recommends:
31
31
  Time::HiRes: '0'
32
32
  requires:
33
33
  perl: '5.004'
34
- version: '13.25'
34
+ version: '13.27'
data/bin/README CHANGED
@@ -109,8 +109,8 @@ your home directory, then you would type the following commands in a
109
109
  terminal window to extract and run ExifTool:
110
110
 
111
111
  cd ~/Desktop
112
- gzip -dc Image-ExifTool-13.25.tar.gz | tar -xf -
113
- cd Image-ExifTool-13.25
112
+ gzip -dc Image-ExifTool-13.27.tar.gz | tar -xf -
113
+ cd Image-ExifTool-13.27
114
114
  ./exiftool t/images/ExifTool.jpg
115
115
 
116
116
  Note: These commands extract meta information from one of the test images.
@@ -170,7 +170,7 @@ COPYRIGHT AND LICENSE
170
170
  Copyright 2003-2025, Phil Harvey
171
171
 
172
172
  This is free software; you can redistribute it and/or modify it under the
173
- same terms as Perl itself.
173
+ same terms as Perl itself (either the Perl Artistic License or GPL).
174
174
 
175
175
  DISTRIBUTION FILES
176
176
 
@@ -40,7 +40,7 @@
40
40
  # 6 int8u - 0xf0 = population E exponent (in format "N.Fe+0E"), 0x0f = population N digit
41
41
  # 7 int16u - 0xf000 = population F digit, 0x0fff = index in region list (admin1)
42
42
  # 9 int16u - v1.02: 0x7fff = index in subregion (admin2), 0x8000 = high bit of time zone
43
- # 9 int16u - v1.03: index in subregion (admin2)
43
+ # 9 int16u - v1.03: index in subregion list (admin2)
44
44
  # 11 int8u - low byte of time zone index
45
45
  # 12 int8u - 0x3f = feature code index (see below), v1.03: 0x80 = high bit of time zone
46
46
  # 13 string - UTF8 City name, terminated by newline
data/bin/exiftool CHANGED
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '13.25';
14
+ my $version = '13.27';
15
15
 
16
16
  $^W = 1; # enable global warnings
17
17
 
@@ -4289,6 +4289,7 @@ sub ScanDir($$;$)
4289
4289
  next unless $recurse;
4290
4290
  # ignore directories starting with "." by default
4291
4291
  next if $file =~ /^\./ and $recurse == 1;
4292
+ # note: this doesn't work in Windows cmd (see forum17243)
4292
4293
  next if $ignore{$file} or ($ignore{SYMLINKS} and -l $path);
4293
4294
  ScanDir($et, $path, $list);
4294
4295
  last if $end;
@@ -5010,7 +5011,7 @@ B<exiftool> [I<OPTIONS>] [-I<TAG>...] [--I<TAG>...] I<FILE>...
5010
5011
 
5011
5012
  =head2 Writing
5012
5013
 
5013
- B<exiftool> [I<OPTIONS>] -I<TAG>[+-E<lt>]=[I<VALUE>]... I<FILE>...
5014
+ B<exiftool> [I<OPTIONS>] -I<TAG>[+-^E<lt>]=[I<VALUE>]... I<FILE>...
5014
5015
 
5015
5016
  =head2 Copying
5016
5017
 
@@ -6053,7 +6054,7 @@ with this command:
6053
6054
 
6054
6055
  produces output like this:
6055
6056
 
6056
- -- Generated by ExifTool 13.25 --
6057
+ -- Generated by ExifTool 13.27 --
6057
6058
  File: a.jpg - 2003:10:31 15:44:19
6058
6059
  (f/5.6, 1/60s, ISO 100)
6059
6060
  File: b.jpg - 2006:05:23 11:57:38
@@ -6550,9 +6551,10 @@ name, or a full path, and is case sensitive. If a full path is specified,
6550
6551
  it must match the Directory tag exactly to be ignored. Use multiple B<-i>
6551
6552
  options to ignore more than one directory name. A special I<DIR> value of
6552
6553
  C<SYMLINKS> may be specified to avoid recursing into directories which are
6553
- symbolic links when the B<-r> option is used. As well, a value of C<HIDDEN>
6554
- may be used to ignore files with names that start with a "." (ie. hidden
6555
- files on Unix systems) when scanning a directory.
6554
+ symbolic links when the B<-r> option is used (note this does not currently
6555
+ work under Windows). As well, a value of C<HIDDEN> may be used to ignore
6556
+ files with names that start with a "." (ie. hidden files on Unix systems)
6557
+ when scanning a directory.
6556
6558
 
6557
6559
  =item B<-if>[I<NUM>] I<EXPR>
6558
6560
 
@@ -2053,7 +2053,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
2053
2053
  # 0x4014 (similar to 0x83?)
2054
2054
  0x4015 => [{
2055
2055
  Name => 'VignettingCorr', # (LensPacket)
2056
- Condition => '$$valPt =~ /^\0/ and $$valPt !~ /^\0\0\0\0/', # (data may be all zeros for 60D)
2056
+ Condition => '$$valPt =~ /^\0/ and $$valPt !~ /^(\0\0\0\0|\x00\x40\xdc\x05)/', # (data may be all zeros for 60D)
2057
2057
  SubDirectory => {
2058
2058
  # (the size word is at byte 2 in this structure)
2059
2059
  Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart+2,$size)',
@@ -2061,7 +2061,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
2061
2061
  },
2062
2062
  },{
2063
2063
  Name => 'VignettingCorrUnknown1',
2064
- Condition => '$$valPt =~ /^[\x01\x02\x10\x20]/ and $$valPt !~ /^\0\0\0\0/',
2064
+ Condition => '$$valPt =~ /^[\x01\x02\x10\x20]/ and $$valPt !~ /^(\0\0\0\0|\x02\x50\x7c\x04)/',
2065
2065
  SubDirectory => {
2066
2066
  # (the size word is at byte 2 in this structure)
2067
2067
  Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart+2,$size)',
@@ -4758,6 +4758,7 @@ my %ciMaxFocal = (
4758
4758
  Format => 'int32u',
4759
4759
  Notes => 'includes electronic + mechanical shutter',
4760
4760
  },
4761
+ # 0x0b5a - related to image stabilization (ref forum17239) (R5)
4761
4762
  # 0x0bb7 - counts down during focus stack (ref forum16111)
4762
4763
  );
4763
4764
 
@@ -336,6 +336,7 @@ my %manuSig = ( #6
336
336
  'Zebr' => 'Zebra Technologies Inc',
337
337
  'ZRAN' => 'Zoran Corporation',
338
338
  # also seen: " ",ACMS,KCMS,UCCM,etc2,SCTX
339
+ # registry: https://www.color.org/signatureRegistry/index.xalter
339
340
  );
340
341
 
341
342
  # ICC_Profile tag table
@@ -65,7 +65,7 @@ use Image::ExifTool::Exif;
65
65
  use Image::ExifTool::GPS;
66
66
  use Image::ExifTool::XMP;
67
67
 
68
- $VERSION = '4.45';
68
+ $VERSION = '4.46';
69
69
 
70
70
  sub LensIDConv($$$);
71
71
  sub ProcessNikonAVI($$$);
@@ -552,6 +552,7 @@ sub GetAFPointGrid($$;$);
552
552
  '21 56 8E 8E 24 24 14 00' => 'Tamron SP AF 300mm f/2.8 LD-IF (60E)',
553
553
  '27 54 8E 8E 24 24 1D 02' => 'Tamron SP AF 300mm f/2.8 LD-IF (360E)',
554
554
  'E1 40 19 36 2C 35 DF 4E' => 'Tamron 10-24mm f/3.5-4.5 Di II VC HLD (B023)',
555
+ 'E1 40 19 36 2C 35 DF 0E' => 'Tamron 10-24mm f/3.5-4.5 Di II VC HLD (B023)', #30
555
556
  'F6 3F 18 37 2C 34 84 06' => 'Tamron SP AF 10-24mm f/3.5-4.5 Di II LD Aspherical (IF) (B001)',
556
557
  'F6 3F 18 37 2C 34 DF 06' => 'Tamron SP AF 10-24mm f/3.5-4.5 Di II LD Aspherical (IF) (B001)', #30
557
558
  '00 36 1C 2D 34 3C 00 06' => 'Tamron SP AF 11-18mm f/4.5-5.6 Di II LD Aspherical (IF) (A13)',
@@ -40,7 +40,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
40
40
  use Image::ExifTool::Exif;
41
41
  use Image::ExifTool::APP12;
42
42
 
43
- $VERSION = '2.84';
43
+ $VERSION = '2.85';
44
44
 
45
45
  sub PrintLensInfo($$$);
46
46
 
@@ -446,6 +446,7 @@ my %olympusCameraTypes = (
446
446
  S0095 => 'OM-1', #IB
447
447
  S0101 => 'OM-5', #IB
448
448
  S0121 => 'OM-1MarkII', #forum15652
449
+ S0123 => 'OM-3', #forum17208
449
450
  SR45 => 'D220',
450
451
  SR55 => 'D320L',
451
452
  SR83 => 'D340L',
@@ -16,7 +16,7 @@ use strict;
16
16
  use vars qw($VERSION);
17
17
  use Image::ExifTool qw(:DataAccess :Utils);
18
18
 
19
- $VERSION = '1.00';
19
+ $VERSION = '1.01';
20
20
 
21
21
  %Image::ExifTool::PCAP::Main = (
22
22
  GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Other' },
@@ -261,14 +261,14 @@ $VERSION = '1.00';
261
261
  },
262
262
  },
263
263
  19373 => {
264
- Name => 'CustomOption3',
264
+ Name => 'CustomOption4',
265
265
  Binary => 1,
266
266
  },
267
267
  #
268
268
  # "options" tags in Section Header Block
269
269
  #
270
270
  'SHB-2' => 'Hardware',
271
- 'SHB-3' => 'OperatingSytem',
271
+ 'SHB-3' => 'OperatingSystem',
272
272
  'SHB-4' => 'UserApplication',
273
273
  #
274
274
  # "options" tags in Interface Description Block
@@ -308,8 +308,8 @@ $VERSION = '1.00';
308
308
  Name => 'Filter',
309
309
  ValueConv => 'Get8u(\$val,0) . ": " . substr($val, 1)',
310
310
  },
311
- 'IDB-12' => 'OperatingSytem',
312
- 'IDB-13' => { Name => 'FCSLen', Format => 'int8u' },
311
+ 'IDB-12' => 'OperatingSystem',
312
+ 'IDB-13' => { Name => 'FrameCheckSequenceLength', Format => 'int8u' },
313
313
  'IDB-14' => {
314
314
  Name => 'TimeStampOffset',
315
315
  Format => 'int64u',
@@ -58,7 +58,7 @@ use Image::ExifTool::Exif;
58
58
  use Image::ExifTool::GPS;
59
59
  use Image::ExifTool::HP;
60
60
 
61
- $VERSION = '3.47';
61
+ $VERSION = '3.49';
62
62
 
63
63
  sub CryptShutterCount($$);
64
64
  sub PrintFilter($$$);
@@ -558,6 +558,7 @@ my %pentaxModelID = (
558
558
  0x13254 => 'K-3 Mark III', #IB (Ricoh)
559
559
  0x13290 => 'WG-70', # (Ricoh)
560
560
  0x1329a => 'GR IIIx', # (Ricoh)
561
+ 0x132b8 => 'KF', #github322 (Ricoh)
561
562
  0x132d6 => 'K-3 Mark III Monochrome', #github226 (Ricoh)
562
563
  );
563
564
 
@@ -736,6 +737,19 @@ my %filterSettings = (
736
737
  52 => ['Toning2', '%+d'], #31 Extract Color (-3-+3)
737
738
  );
738
739
 
740
+ # order of K-3iii AF points
741
+ my @k3iiiAF = qw(C3 C4 C5 C6 C7 D3 D4 D5 D6 D7 E3 E4 E5 E6 E7 F3 F4 F5 F6 F7
742
+ G3 G4 G5 G6 G7 E1 E9 D2 D8 E2 E8 F2 F8 C2 C8 G2 G8 D1 D9 F1 F9);
743
+
744
+ # print AF Point names
745
+ sub AFPointsK3iii($;$)
746
+ {
747
+ my @a = split ' ', shift;
748
+ my @pts;
749
+ $a[$_] and push @pts, $k3iiiAF[$_] || "Unknown($_)" foreach 0..$#a;
750
+ return @pts ? join '.', sort @pts : '(none)';
751
+ }
752
+
739
753
  # decoding for Pentax Firmware ID tags - PH
740
754
  my %pentaxFirmwareID = (
741
755
  # the first 2 numbers are the firmware version, I'm not sure what the second 2 mean
@@ -5016,6 +5030,31 @@ my %binaryDataAttrs = (
5016
5030
  20 => 'Mid-right',
5017
5031
  },
5018
5032
  },
5033
+ 0x14 => {
5034
+ Name => 'AFPointValues',
5035
+ Format => 'int16uRev[61]',
5036
+ Unknown => 1,
5037
+ Notes => 'some unknown values related to each AFPoint',
5038
+ # order is the same as AFPoints below, but there is an additional value for the
5039
+ # following AFPoints in this order starting at index 28 in the array: C3 C4 C5 C6 C7
5040
+ # D3 D4 D5 D6 D7 E3 E4 E5 E6 E7 F3 F4 F5 F6 F7 G3 G4 G5 G6 G7 E1 E9 D2 D8 E2 E8 F2 F8
5041
+ # (values are int16s stored in reversed byte order)
5042
+ ValueConv => 'my @a=split " ",$val;$_>32767 and $_-=65536 foreach @a;join " ",@a',
5043
+ },
5044
+ 0x12a => { # byte has a value of 2 if corresponding AF point is selected
5045
+ Name => 'AFPoints',
5046
+ Condition => '$$self{Model} eq "PENTAX K-3 Mark III"', # any other models?
5047
+ Format => 'int8u[41]',
5048
+ PrintConv => \&AFPointsK3iii,
5049
+ },
5050
+ 0x18f => { # byte has a value of 1 if corresponding AF point is in focus maybe?
5051
+ # usually the same points as AFPoints above, but not always
5052
+ Name => 'AFPointsUnknown',
5053
+ Condition => '$$self{Model} eq "PENTAX K-3 Mark III"', # any other models?
5054
+ Unknown => 1,
5055
+ Format => 'int8u[41]',
5056
+ PrintConv => \&AFPointsK3iii,
5057
+ },
5019
5058
  0x1fa => {
5020
5059
  Name => 'LiveView',
5021
5060
  Notes => 'decoded only for the K-3 III',
@@ -5739,6 +5778,7 @@ my %binaryDataAttrs = (
5739
5778
  # more quickly than CameraTemperature when shooting video.)
5740
5779
  0x0c => {
5741
5780
  Name => 'SensorTemperature', #forum6677 (was CameraTemperature2)
5781
+ Condition => '$$self{Model} !~ /K-3 Mark III/', # (and maybe others?)
5742
5782
  Format => 'int16s',
5743
5783
  ValueConv => '$val / 10',
5744
5784
  ValueConvInv => '$val * 10',
@@ -5747,6 +5787,7 @@ my %binaryDataAttrs = (
5747
5787
  },
5748
5788
  0x0e => {
5749
5789
  Name => 'SensorTemperature2', #forum6677 (was CameraTemperature3)
5790
+ Condition => '$$self{Model} ne "K-3 Mark III"', # (and maybe others?)
5750
5791
  Format => 'int16s',
5751
5792
  ValueConv => '$val / 10',
5752
5793
  ValueConvInv => '$val * 10',
@@ -5768,6 +5809,15 @@ my %binaryDataAttrs = (
5768
5809
  PrintConvInv => '$val=~s/ ?c$//i; $val',
5769
5810
  },
5770
5811
  # 0x18,0x1a,0x1c,0x1e = int16u[4] BlackPoint - PH
5812
+ 0x2a => {
5813
+ Name => 'SensorTemperature',
5814
+ Condition => '$$self{Model} =~ /K-3 Mark III/',
5815
+ Format => 'int16s',
5816
+ ValueConv => '$val / 10',
5817
+ ValueConvInv => '$val * 10',
5818
+ PrintConv => 'sprintf("%.1f C", $val)',
5819
+ PrintConvInv => '$val=~s/ ?c$//i; $val',
5820
+ },
5771
5821
  );
5772
5822
 
5773
5823
  # currently unknown info
@@ -38,6 +38,7 @@
38
38
  # 26) https://github.com/SamsungVR/android_upload_sdk/blob/master/SDKLib/src/main/java/com/samsung/msca/samsungvr/sdk/UserVideo.java
39
39
  # 27) https://exiftool.org/forum/index.php?topic=11517.0
40
40
  # 28) https://docs.mp3tag.de/mapping/
41
+ # 29) https://developer.apple.com/documentation/quicktime-file-format/media_data_reference_atom
41
42
  #------------------------------------------------------------------------------
42
43
 
43
44
  package Image::ExifTool::QuickTime;
@@ -48,7 +49,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
48
49
  use Image::ExifTool::Exif;
49
50
  use Image::ExifTool::GPS;
50
51
 
51
- $VERSION = '3.14';
52
+ $VERSION = '3.15';
52
53
 
53
54
  sub ProcessMOV($$;$);
54
55
  sub ProcessKeys($$$);
@@ -502,7 +503,7 @@ my %qtFlags = ( #12
502
503
  # (used only to avoid warnings when Validate-ing)
503
504
  my %dupTagOK = ( mdat => 1, trak => 1, free => 1, infe => 1, sgpd => 1, dimg => 1, CCDT => 1,
504
505
  sbgp => 1, csgm => 1, uuid => 1, cdsc => 1, maxr => 1, '----' => 1 );
505
- my %dupDirOK = ( ipco => 1, '----' => 1 );
506
+ my %dupDirOK = ( ipco => 1, iref => 1, '----' => 1 );
506
507
 
507
508
  # the usual atoms required to decode timed metadata with the ExtractEmbedded option
508
509
  my %eeStd = ( stco => 'stbl', co64 => 'stbl', stsz => 'stbl', stz2 => 'stbl',
@@ -944,7 +945,7 @@ my %userDefined = (
944
945
  Notes => 'MP4-format video saved in Samsung motion-photo HEIC images.',
945
946
  Binary => 1,
946
947
  # note that this may be written and/or deleted, but can't currently be added back again
947
- Writable => 1,
948
+ Writable => 'undef',
948
949
  },
949
950
  # '35AX'? - seen "AT" (Yada RoadCam Pro 4K dashcam)
950
951
  cust => 'CustomInfo', # 70mai A810
@@ -1227,6 +1228,7 @@ my %userDefined = (
1227
1228
  # clip - clipping --> contains crgn (clip region) (ref 12)
1228
1229
  # mvex - movie extends --> contains mehd (movie extends header), trex (track extends) (ref 14)
1229
1230
  # ICAT - 4 bytes: "6350" (Nikon CoolPix S6900), "6500" (Panasonic FT7)
1231
+ # ctab - color table (ref 29)
1230
1232
  );
1231
1233
 
1232
1234
  # (ref CFFMediaFormat-2_1.pdf)
@@ -1426,6 +1428,7 @@ my %userDefined = (
1426
1428
  # load - track loading settings
1427
1429
  # imap - track input map --> contains ' in' --> contains ' ty', obid
1428
1430
  # prfl - Profile (ref 12)
1431
+ # txas - track exclude from autoselection (ref 29)
1429
1432
  );
1430
1433
 
1431
1434
  # track header data block
@@ -1630,6 +1633,10 @@ my %userDefined = (
1630
1633
  Start => 4, # must skip 4-byte version number header
1631
1634
  },
1632
1635
  },
1636
+ tnam => { #29 (NC)
1637
+ Name => 'TrackName',
1638
+ IText => 4,
1639
+ },
1633
1640
  'ptv '=> {
1634
1641
  Name => 'PrintToVideo',
1635
1642
  SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Video' },
@@ -2801,6 +2808,8 @@ my %userDefined = (
2801
2808
  Name => 'Unknown_grpl',
2802
2809
  SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::grpl' },
2803
2810
  },
2811
+ # ctry - country list (ref 29)
2812
+ # lang - language list (ref 29)
2804
2813
  );
2805
2814
 
2806
2815
  # unknown grpl container
@@ -3279,21 +3288,28 @@ my %userDefined = (
3279
3288
  %Image::ExifTool::QuickTime::TrackRef = (
3280
3289
  PROCESS_PROC => \&ProcessMOV,
3281
3290
  GROUPS => { 1 => 'Track#', 2 => 'Video' },
3282
- chap => { Name => 'ChapterListTrackID', Format => 'int32u' },
3283
- tmcd => { Name => 'TimeCode', Format => 'int32u' },
3291
+ chap => { Name => 'ChapterListTrackID', Format => 'int32u' },
3292
+ tmcd => { Name => 'TimecodeTrack', Format => 'int32u' },
3284
3293
  mpod => { #PH (FLIR MP4)
3285
3294
  Name => 'ElementaryStreamTrack',
3286
3295
  Format => 'int32u',
3287
3296
  ValueConv => '$val =~ s/^1 //; $val', # (why 2 numbers? -- ignore the first if "1")
3288
3297
  },
3289
- # also: sync, scpt, ssrc, iTunesInfo
3298
+ # also: iTunesInfo
3290
3299
  cdsc => {
3291
3300
  Name => 'ContentDescribes',
3292
3301
  Format => 'int32u',
3293
3302
  PrintConv => '"Track $val"',
3294
3303
  },
3295
- # cdep (Structural Dependency QT tag?)
3296
- # fall - ? int32u, seen: 2
3304
+ clcp => { Name => 'ClosedCaptionTrack', Format => 'int32u' }, #29
3305
+ fall => { Name => 'AlternateFormatTrack', Format => 'int32u' }, #29
3306
+ folw => { Name => 'SubtitleTrack', Format => 'int32u' }, #29
3307
+ forc => { Name => 'ForcedSubtitleTrack', Format => 'int32u' }, #29
3308
+ scpt => { Name => 'TranscriptTrack', Format => 'int32u' }, #29
3309
+ ssrc => { Name => 'Non-primarySourceTrack', Format => 'int32u' }, #29
3310
+ sync => { Name => 'SyncronizedTrack', Format => 'int32u' }, #29
3311
+ # hint - Original media for hint track (ref 29)
3312
+ # cdep (Structural Dependency QT tag?)
3297
3313
  );
3298
3314
 
3299
3315
  # track aperture mode dimensions atoms
@@ -6582,7 +6598,6 @@ my %userDefined = (
6582
6598
  'apple.photos.variation-identifier' => { Name => 'ApplePhotosVariationIdentifier', Writable => 'int64s' },
6583
6599
  'direction.facing' => { Name => 'CameraDirection', Groups => { 2 => 'Location' } },
6584
6600
  'direction.motion' => { Name => 'CameraMotion', Groups => { 2 => 'Location' } },
6585
- 'location.body' => { Name => 'LocationBody', Groups => { 2 => 'Location' } },
6586
6601
  'player.version' => 'PlayerVersion',
6587
6602
  'player.movie.visual.brightness'=> 'Brightness',
6588
6603
  'player.movie.visual.color' => 'Color',
@@ -7046,6 +7061,7 @@ my %userDefined = (
7046
7061
  Name => 'MediaInfo',
7047
7062
  SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::MediaInfo' },
7048
7063
  },
7064
+ elng => 'ExtendedLanguageTag', #29 (NC) eg. "zh-CN"
7049
7065
  );
7050
7066
 
7051
7067
  # MP4 media header box (ref 5)
@@ -7637,6 +7653,8 @@ my %userDefined = (
7637
7653
  mrlh => { Name => 'MarlinHeader', SubDirectory => { TagTable => 'Image::ExifTool::GM::mrlh' } },
7638
7654
  mrlv => { Name => 'MarlinValues', SubDirectory => { TagTable => 'Image::ExifTool::GM::mrlv' } },
7639
7655
  mrld => { Name => 'MarlinDictionary',SubDirectory => { TagTable => 'Image::ExifTool::GM::mrld' } },
7656
+ # tbox - text box (ref 29)
7657
+ # styl - subtitle style (ref 29)
7640
7658
  );
7641
7659
 
7642
7660
  # AMR decode config box (ref 3)
@@ -111,9 +111,8 @@ my %insvLimit = (
111
111
  The tags below are extracted from timed metadata in QuickTime and other
112
112
  formats of video files when the ExtractEmbedded option is used. Although
113
113
  most of these tags are combined into the single table below, ExifTool
114
- currently reads 103 different types of timed GPS metadata from video files.
114
+ currently reads 104 different types of timed GPS metadata from video files.
115
115
  },
116
- VARS => { NO_ID => 1 },
117
116
  GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
118
117
  GPSLongitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")' },
119
118
  GPSLatitude2 => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")' },
@@ -336,11 +335,25 @@ my %insvLimit = (
336
335
  Groups => { 0 => 'Trailer', 1 => 'Insta360' }, # (so these groups will appear in the -listg options)
337
336
  SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::INSV_MakerNotes' },
338
337
  },
339
- ssmd => { # Chigee AIO-5 dashcam
340
- Name => 'PreviewImage',
338
+ ssmd => [{
339
+ Name => 'RoveGPS', # Rove R2-4K new model
340
+ # double value of GPSLatitude is 4294967295 (00 00 e0 ff ff ff ef 41) for no GPS
341
+ Condition => 'length $$valPt == 32 and $$valPt !~ /^\0\0\xe0\xff\xff\xff\xef\x41/',
342
+ SubDirectory => {
343
+ TagTable => 'Image::ExifTool::QuickTime::RoveGPS',
344
+ ByteOrder => 'Little-Endian',
345
+ },
346
+ },{
347
+ Name => 'Accelerometer', # Rove R2-4K new model
348
+ Condition => 'length $$valPt == 12',
349
+ Format => 'float',
350
+ ByteOrder => 'Little-Endian',
351
+ },{
352
+ Name => 'PreviewImage', # Chigee AIO-5 dashcam
353
+ Condition => '$$valPt =~ /^\xff\xd8\xff/',
341
354
  Groups => { 2 => 'Preview' },
342
355
  RawConv => '$self->ValidateImage(\$val,$tag)',
343
- },
356
+ }],
344
357
  djmd => { # (DJI AC003 Osmo Action 4 cam)
345
358
  Name => 'DJIMetadata',
346
359
  SubDirectory => { TagTable => 'Image::ExifTool::DJI::Protobuf' },
@@ -358,6 +371,45 @@ my %insvLimit = (
358
371
  MagneticVariation => { }, # (from LIGOGPSINFO)
359
372
  );
360
373
 
374
+ # accelerometer from newer Rove R2-4K cam
375
+ %Image::ExifTool::QuickTime::RoveGPS = (
376
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
377
+ GROUPS => { 2 => 'Location' },
378
+ FIRST_ENTRY => 0,
379
+ 0 => {
380
+ Name => 'GPSLatitude',
381
+ Format => 'double',
382
+ ValueConv => 'my $deg = int($val/100); $val = $deg + ($val - $deg * 100) / 60',
383
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
384
+ },
385
+ 8 => {
386
+ Name => 'GPSLongitude',
387
+ Format => 'double',
388
+ ValueConv => 'my $deg = int($val/100); $val = $deg + ($val - $deg * 100) / 60',
389
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
390
+ },
391
+ 20 => {
392
+ Name => 'GPSSpeed',
393
+ Format => 'int16u',
394
+ ValueConv => '$val * 1.852', # convert from knots to km/h
395
+ },
396
+ 22 => {
397
+ Name => 'GPSDateTime',
398
+ Description => 'GPS Date/Time',
399
+ Groups => { 2 => 'Time' },
400
+ Format => 'int8u[6]',
401
+ ValueConv => q{
402
+ my @v = split ' ', $val;
403
+ $v[0] += 2000;
404
+ sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', @v);
405
+ },
406
+ PrintConv => '$self->ConvertDateTime($val)',
407
+ },
408
+ # Seen this in the next 4 bytes:
409
+ # ff 01 01 00 - good GPS?
410
+ # ff 00 ff ff - no GPS?
411
+ );
412
+
361
413
  # tags found in 'camm' type 0 timed metadata (ref 4)
362
414
  %Image::ExifTool::QuickTime::camm0 = (
363
415
  PROCESS_PROC => \&ProcessCAMM,
@@ -2351,12 +2403,12 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
2351
2403
  }
2352
2404
  SetByteOrder($oldOrder);
2353
2405
  return $$et{DOC_NUM} ? 1 : 0 if $done;
2354
- return 0 if defined $yr and $mon < 1 or $mon > 12; # quick sanity check
2406
+ return 0 if defined $yr and ($mon < 1 or $mon > 12); # quick sanity check
2355
2407
  #
2356
2408
  # save tag values extracted by above code
2357
2409
  #
2358
2410
  FoundSomething($et, $tagTbl, $$dirInfo{SampleTime}, $$dirInfo{SampleDuration});
2359
- $sec = '0' . $sec unless $sec =~ /^\d{2}/; # pad integer part of seconds to 2 digits
2411
+ $sec = '0' . $sec if defined $sec and $sec !~ /^\d{2}/; # pad integer part of seconds to 2 digits
2360
2412
  if (defined $yr) {
2361
2413
  $yr += 2000 if $yr < 2000;
2362
2414
  my $time = sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%sZ',$yr,$mon,$day,$hr,$min,$sec);
@@ -2368,8 +2420,8 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
2368
2420
  if (defined $lat and defined $lon) {
2369
2421
  # lat/long are in DDDMM.MMMM format unless $ddd is set
2370
2422
  ConvertLatLon($lat, $lon) unless $ddd;
2371
- $et->HandleTag($tagTbl, GPSLatitude => $lat * ($latRef eq 'S' ? -1 : 1));
2372
- $et->HandleTag($tagTbl, GPSLongitude => $lon * ($lonRef eq 'W' ? -1 : 1));
2423
+ $et->HandleTag($tagTbl, GPSLatitude => $lat * (($latRef and $latRef eq 'S') ? -1 : 1));
2424
+ $et->HandleTag($tagTbl, GPSLongitude => $lon * (($lonRef and $lonRef eq 'W') ? -1 : 1));
2373
2425
  }
2374
2426
  $et->HandleTag($tagTbl, GPSAltitude => $alt) if defined $alt;
2375
2427
  $et->HandleTag($tagTbl, GPSSpeed => $spd) if defined $spd;
@@ -982,6 +982,11 @@ numerical, and generated automatically otherwise.
982
982
  for use when ExtractInfo is called with the ReEntry flag from
983
983
  inside the RawConv of a tag.
984
984
 
985
+ ByteOrder : [Non-writable tags extracted with HandleTag and writable EXIF
986
+ offset-pair tags only] Specifies byte order if tag value is
987
+ stored with a constant byte order that is different from that
988
+ of the parent directory.
989
+
985
990
  TagID : [reserved] Used internally to save the table key for this tag.
986
991
  Note: For XMP tables this corresponds to the XMP property
987
992
  name, but the table key may have a full XMP namespace prefix
@@ -1071,8 +1076,8 @@ numerical, and generated automatically otherwise.
1071
1076
  ByteOrder : Specifies byte ordering if different than than the rest of the
1072
1077
  file. Must be either BigEndian, LittleEndian or Unknown. If
1073
1078
  Unknown is specified, the byte order will be determined from
1074
- the directory count (however, this can not be done if OffsetPt
1075
- is specified).
1079
+ the directory count for EXIF (however, this can not be done if
1080
+ OffsetPt is specified).
1076
1081
 
1077
1082
  Validate : If given, specifies Perl expression which is used to validate
1078
1083
  the subdirectory data (regardless of Validate option setting).