exiftool_vendored 13.17.0 → 13.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/Changes +33 -6
- data/bin/MANIFEST +1 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/config_files/example.config +1 -1
- data/bin/exiftool +12 -8
- data/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/DJI.pm +99 -11
- data/bin/lib/Image/ExifTool/GoPro.pm +58 -48
- data/bin/lib/Image/ExifTool/ICO.pm +2 -2
- data/bin/lib/Image/ExifTool/Kodak.pm +3 -2
- data/bin/lib/Image/ExifTool/Nikon.pm +45 -19
- data/bin/lib/Image/ExifTool/PDF.pm +10 -1
- data/bin/lib/Image/ExifTool/PLIST.pm +42 -4
- data/bin/lib/Image/ExifTool/Photoshop.pm +2 -2
- data/bin/lib/Image/ExifTool/Protobuf.pm +1 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +273 -262
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +19 -5
- data/bin/lib/Image/ExifTool/Sony.pm +16 -10
- data/bin/lib/Image/ExifTool/TagLookup.pm +712 -663
- data/bin/lib/Image/ExifTool/TagNames.pod +162 -64
- data/bin/lib/Image/ExifTool/Trailer.pm +1 -1
- data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +49 -3
- data/bin/lib/Image/ExifTool/Writer.pl +5 -3
- data/bin/lib/Image/ExifTool/XMP.pm +17 -3
- data/bin/lib/Image/ExifTool/XMP2.pl +2 -0
- data/bin/lib/Image/ExifTool.pm +15 -16
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
@@ -43,7 +43,7 @@
|
|
43
43
|
package Image::ExifTool::QuickTime;
|
44
44
|
|
45
45
|
use strict;
|
46
|
-
use vars qw($VERSION $AUTOLOAD %stringEncoding %avType);
|
46
|
+
use vars qw($VERSION $AUTOLOAD %stringEncoding %avType %dontInherit);
|
47
47
|
use Image::ExifTool qw(:DataAccess :Utils);
|
48
48
|
use Image::ExifTool::Exif;
|
49
49
|
use Image::ExifTool::GPS;
|
@@ -487,9 +487,13 @@ my %qtFlags = ( #12
|
|
487
487
|
);
|
488
488
|
|
489
489
|
# properties which don't get inherited from the parent
|
490
|
-
|
491
|
-
|
492
|
-
|
490
|
+
# 1 = parent doesn't inherit this property
|
491
|
+
# 2 = parent doesn't inherit, but child does
|
492
|
+
%dontInherit = (
|
493
|
+
ispe => 1, # primary item must have an ispe and pixi, so no need to inherit these
|
494
|
+
pixi => 1,
|
495
|
+
hvcC => 2, # (hvcC is a property of hvc1 referred to by primary grid)
|
496
|
+
colr => 2, # (colr is a property of primary grid or hvc1 referred to by primary)
|
493
497
|
);
|
494
498
|
|
495
499
|
# tags that may be duplicated and directories that may contain duplicate tags
|
@@ -510,7 +514,7 @@ my %hashBox = ( vide => { %eeStd }, soun => { %eeStd } );
|
|
510
514
|
# used, but others have been checked against all available sample files and may be
|
511
515
|
# useful in the future if the names are used for different boxes on other locations)
|
512
516
|
my %eeBox = (
|
513
|
-
# (note: vide is only processed if specific atoms exist in the
|
517
|
+
# (note: vide is only processed if specific atoms exist in the VisualSampleDesc)
|
514
518
|
vide => { %eeStd, JPEG => 'stsd' },
|
515
519
|
text => { %eeStd },
|
516
520
|
meta => { %eeStd },
|
@@ -1005,7 +1009,7 @@ my %userDefined = (
|
|
1005
1009
|
NOTES => 'Tags used in QTIF QuickTime Image Files.',
|
1006
1010
|
idsc => {
|
1007
1011
|
Name => 'ImageDescription',
|
1008
|
-
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::
|
1012
|
+
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::VisualSampleDesc' },
|
1009
1013
|
},
|
1010
1014
|
idat => {
|
1011
1015
|
Name => 'ImageData',
|
@@ -1017,158 +1021,6 @@ my %userDefined = (
|
|
1017
1021
|
},
|
1018
1022
|
);
|
1019
1023
|
|
1020
|
-
# image description data block
|
1021
|
-
%Image::ExifTool::QuickTime::ImageDesc = (
|
1022
|
-
PROCESS_PROC => \&ProcessHybrid,
|
1023
|
-
VARS => { ID_LABEL => 'ID/Index' },
|
1024
|
-
GROUPS => { 2 => 'Image' },
|
1025
|
-
FORMAT => 'int16u',
|
1026
|
-
2 => {
|
1027
|
-
Name => 'CompressorID',
|
1028
|
-
Format => 'string[4]',
|
1029
|
-
# not very useful since this isn't a complete list and name is given below
|
1030
|
-
# # ref http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html
|
1031
|
-
# PrintConv => {
|
1032
|
-
# cvid => 'Cinepak',
|
1033
|
-
# jpeg => 'JPEG',
|
1034
|
-
# 'smc '=> 'Graphics',
|
1035
|
-
# 'rle '=> 'Animation',
|
1036
|
-
# rpza => 'Apple Video',
|
1037
|
-
# kpcd => 'Kodak Photo CD',
|
1038
|
-
# 'png '=> 'Portable Network Graphics',
|
1039
|
-
# mjpa => 'Motion-JPEG (format A)',
|
1040
|
-
# mjpb => 'Motion-JPEG (format B)',
|
1041
|
-
# SVQ1 => 'Sorenson video, version 1',
|
1042
|
-
# SVQ3 => 'Sorenson video, version 3',
|
1043
|
-
# mp4v => 'MPEG-4 video',
|
1044
|
-
# 'dvc '=> 'NTSC DV-25 video',
|
1045
|
-
# dvcp => 'PAL DV-25 video',
|
1046
|
-
# 'gif '=> 'Compuserve Graphics Interchange Format',
|
1047
|
-
# h263 => 'H.263 video',
|
1048
|
-
# tiff => 'Tagged Image File Format',
|
1049
|
-
# 'raw '=> 'Uncompressed RGB',
|
1050
|
-
# '2vuY'=> "Uncompressed Y'CbCr, 3x8-bit 4:2:2 (2vuY)",
|
1051
|
-
# 'yuv2'=> "Uncompressed Y'CbCr, 3x8-bit 4:2:2 (yuv2)",
|
1052
|
-
# v308 => "Uncompressed Y'CbCr, 8-bit 4:4:4",
|
1053
|
-
# v408 => "Uncompressed Y'CbCr, 8-bit 4:4:4:4",
|
1054
|
-
# v216 => "Uncompressed Y'CbCr, 10, 12, 14, or 16-bit 4:2:2",
|
1055
|
-
# v410 => "Uncompressed Y'CbCr, 10-bit 4:4:4",
|
1056
|
-
# v210 => "Uncompressed Y'CbCr, 10-bit 4:2:2",
|
1057
|
-
# hvc1 => 'HEVC', #PH
|
1058
|
-
# },
|
1059
|
-
},
|
1060
|
-
10 => {
|
1061
|
-
Name => 'VendorID',
|
1062
|
-
Format => 'string[4]',
|
1063
|
-
RawConv => 'length $val ? $val : undef',
|
1064
|
-
PrintConv => \%vendorID,
|
1065
|
-
SeparateTable => 'VendorID',
|
1066
|
-
},
|
1067
|
-
# 14 - ("Quality" in QuickTime docs) ??
|
1068
|
-
16 => 'SourceImageWidth',
|
1069
|
-
17 => 'SourceImageHeight',
|
1070
|
-
18 => { Name => 'XResolution', Format => 'fixed32u' },
|
1071
|
-
20 => { Name => 'YResolution', Format => 'fixed32u' },
|
1072
|
-
# 24 => 'FrameCount', # always 1 (what good is this?)
|
1073
|
-
25 => {
|
1074
|
-
Name => 'CompressorName',
|
1075
|
-
Format => 'string[32]',
|
1076
|
-
# (sometimes this is a Pascal string, and sometimes it is a C string)
|
1077
|
-
RawConv => q{
|
1078
|
-
$val=substr($val,1,ord($1)) if $val=~/^([\0-\x1f])/ and ord($1)<length($val);
|
1079
|
-
length $val ? $val : undef;
|
1080
|
-
},
|
1081
|
-
},
|
1082
|
-
41 => 'BitDepth',
|
1083
|
-
#
|
1084
|
-
# Observed offsets for child atoms of various CompressorID types:
|
1085
|
-
#
|
1086
|
-
# CompressorID Offset Child atoms
|
1087
|
-
# ----------- ------ ----------------
|
1088
|
-
# avc1 86 avcC, btrt, colr, pasp, fiel, clap, svcC
|
1089
|
-
# mp4v 86 esds, pasp
|
1090
|
-
# s263 86 d263
|
1091
|
-
#
|
1092
|
-
btrt => {
|
1093
|
-
Name => 'BitrateInfo',
|
1094
|
-
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Bitrate' },
|
1095
|
-
},
|
1096
|
-
# Reference for fiel, colr, pasp, clap:
|
1097
|
-
# https://developer.apple.com/library/mac/technotes/tn2162/_index.html#//apple_ref/doc/uid/DTS40013070-CH1-TNTAG9
|
1098
|
-
fiel => {
|
1099
|
-
Name => 'VideoFieldOrder',
|
1100
|
-
ValueConv => 'join(" ", unpack("C*",$val))',
|
1101
|
-
PrintConv => [{
|
1102
|
-
1 => 'Progressive',
|
1103
|
-
2 => '2:1 Interlaced',
|
1104
|
-
}],
|
1105
|
-
},
|
1106
|
-
colr => {
|
1107
|
-
Name => 'ColorRepresentation',
|
1108
|
-
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ColorRep' },
|
1109
|
-
},
|
1110
|
-
pasp => {
|
1111
|
-
Name => 'PixelAspectRatio',
|
1112
|
-
ValueConv => 'join(":", unpack("N*",$val))',
|
1113
|
-
},
|
1114
|
-
clap => {
|
1115
|
-
Name => 'CleanAperture',
|
1116
|
-
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::CleanAperture' },
|
1117
|
-
},
|
1118
|
-
avcC => {
|
1119
|
-
# (see http://thompsonng.blogspot.ca/2010/11/mp4-file-format-part-2.html)
|
1120
|
-
Name => 'AVCConfiguration',
|
1121
|
-
Unknown => 1,
|
1122
|
-
Binary => 1,
|
1123
|
-
},
|
1124
|
-
JPEG => { # (found in CR3 images; used as a flag to identify JpgFromRaw 'vide' stream)
|
1125
|
-
Name => 'JPEGInfo',
|
1126
|
-
# (4 bytes all zero)
|
1127
|
-
Unknown => 1,
|
1128
|
-
Binary => 1,
|
1129
|
-
},
|
1130
|
-
# hvcC - HEVC configuration
|
1131
|
-
# svcC - 7 bytes: 00 00 00 00 ff e0 00
|
1132
|
-
# esds - elementary stream descriptor
|
1133
|
-
# d263
|
1134
|
-
gama => { Name => 'Gamma', Format => 'fixed32u' },
|
1135
|
-
# mjqt - default quantization table for MJPEG
|
1136
|
-
# mjht - default Huffman table for MJPEG
|
1137
|
-
# csgm ? (seen in hevc video)
|
1138
|
-
CMP1 => { # Canon CR3
|
1139
|
-
Name => 'CMP1',
|
1140
|
-
SubDirectory => { TagTable => 'Image::ExifTool::Canon::CMP1' },
|
1141
|
-
},
|
1142
|
-
CDI1 => { # Canon CR3
|
1143
|
-
Name => 'CDI1',
|
1144
|
-
SubDirectory => {
|
1145
|
-
TagTable => 'Image::ExifTool::Canon::CDI1',
|
1146
|
-
Start => 4,
|
1147
|
-
},
|
1148
|
-
},
|
1149
|
-
# JPEG - 4 bytes all 0 (Canon CR3)
|
1150
|
-
# free - (Canon CR3)
|
1151
|
-
#
|
1152
|
-
# spherical video v2 stuff (untested)
|
1153
|
-
#
|
1154
|
-
st3d => {
|
1155
|
-
Name => 'Stereoscopic3D',
|
1156
|
-
Format => 'int8u',
|
1157
|
-
ValueConv => '$val =~ s/.* //; $val', # (remove leading version/flags bytes?)
|
1158
|
-
PrintConv => {
|
1159
|
-
0 => 'Monoscopic',
|
1160
|
-
1 => 'Stereoscopic Top-Bottom',
|
1161
|
-
2 => 'Stereoscopic Left-Right',
|
1162
|
-
3 => 'Stereoscopic Stereo-Custom',
|
1163
|
-
4 => 'Stereoscopic Right-Left',
|
1164
|
-
},
|
1165
|
-
},
|
1166
|
-
sv3d => {
|
1167
|
-
Name => 'SphericalVideo',
|
1168
|
-
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::sv3d' },
|
1169
|
-
},
|
1170
|
-
);
|
1171
|
-
|
1172
1024
|
# 'sv3d' atom information (ref https://github.com/google/spatial-media/blob/master/docs/spherical-video-v2-rfc.md)
|
1173
1025
|
%Image::ExifTool::QuickTime::sv3d = (
|
1174
1026
|
PROCESS_PROC => \&ProcessMOV,
|
@@ -2227,7 +2079,7 @@ my %userDefined = (
|
|
2227
2079
|
ValueConvInv => 'pack("H*",$val)',
|
2228
2080
|
},
|
2229
2081
|
# SETT? 12 bytes (Hero4)
|
2230
|
-
|
2082
|
+
MUID => { Name => 'MediaUID', ValueConv => 'unpack("H*", $val)' },
|
2231
2083
|
# HMMT? 404 bytes (Hero4, all zero)
|
2232
2084
|
# BCID? 26 bytes (Hero5, all zero), 36 bytes GoPro Max
|
2233
2085
|
# GUMI? 16 bytes (Hero5)
|
@@ -2987,7 +2839,8 @@ my %userDefined = (
|
|
2987
2839
|
ipma => {
|
2988
2840
|
Name => 'ItemPropertyAssociation',
|
2989
2841
|
RawConv => \&ParseItemPropAssoc,
|
2990
|
-
|
2842
|
+
# (comment out because we do this manually _before_ ipco when writing)
|
2843
|
+
# WriteHook => \&ParseItemPropAssoc,
|
2991
2844
|
Notes => 'parsed, but not extracted as a tag',
|
2992
2845
|
},
|
2993
2846
|
);
|
@@ -3001,7 +2854,9 @@ my %userDefined = (
|
|
3001
2854
|
colr => [{
|
3002
2855
|
Name => 'ICC_Profile',
|
3003
2856
|
Condition => '$$valPt =~ /^(prof|rICC)/',
|
3004
|
-
|
2857
|
+
# (don't do this because Apple Preview won't display an HEIC with a 0-length profile)
|
2858
|
+
# Permanent => 0, # (in QuickTime, this writes a zero-length box instead of deleting)
|
2859
|
+
Permanent => 1,
|
3005
2860
|
SubDirectory => {
|
3006
2861
|
TagTable => 'Image::ExifTool::ICC_Profile::Main',
|
3007
2862
|
Start => 4,
|
@@ -7324,10 +7179,10 @@ my %userDefined = (
|
|
7324
7179
|
ProcessProc => \&ProcessSampleDesc,
|
7325
7180
|
},
|
7326
7181
|
},{
|
7327
|
-
Name => '
|
7182
|
+
Name => 'VisualSampleDesc',
|
7328
7183
|
Condition => '$$self{HandlerType} and $$self{HandlerType} eq "vide"',
|
7329
7184
|
SubDirectory => {
|
7330
|
-
TagTable => 'Image::ExifTool::QuickTime::
|
7185
|
+
TagTable => 'Image::ExifTool::QuickTime::VisualSampleDesc',
|
7331
7186
|
ProcessProc => \&ProcessSampleDesc,
|
7332
7187
|
},
|
7333
7188
|
},{
|
@@ -7463,6 +7318,7 @@ my %userDefined = (
|
|
7463
7318
|
# see this link for print conversions (not complete):
|
7464
7319
|
# https://github.com/yannickcr/brooser/blob/master/php/librairies/getid3/module.audio-video.quicktime.php
|
7465
7320
|
},
|
7321
|
+
# 14 - int16u DataReferenceIndex
|
7466
7322
|
20 => { #PH
|
7467
7323
|
Name => 'AudioVendorID',
|
7468
7324
|
Condition => '$$self{AudioFormat} ne "mp4s"',
|
@@ -7527,6 +7383,252 @@ my %userDefined = (
|
|
7527
7383
|
# dapa - ? 203 bytes
|
7528
7384
|
);
|
7529
7385
|
|
7386
|
+
# video and image sample description data block
|
7387
|
+
%Image::ExifTool::QuickTime::VisualSampleDesc = (
|
7388
|
+
PROCESS_PROC => \&ProcessHybrid,
|
7389
|
+
VARS => { ID_LABEL => 'ID/Index' },
|
7390
|
+
GROUPS => { 2 => 'Image' },
|
7391
|
+
FORMAT => 'int16u',
|
7392
|
+
2 => {
|
7393
|
+
Name => 'CompressorID',
|
7394
|
+
Format => 'string[4]',
|
7395
|
+
# not very useful since this isn't a complete list and name is given below
|
7396
|
+
# # ref http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html
|
7397
|
+
# PrintConv => {
|
7398
|
+
# cvid => 'Cinepak',
|
7399
|
+
# jpeg => 'JPEG',
|
7400
|
+
# 'smc '=> 'Graphics',
|
7401
|
+
# 'rle '=> 'Animation',
|
7402
|
+
# rpza => 'Apple Video',
|
7403
|
+
# kpcd => 'Kodak Photo CD',
|
7404
|
+
# 'png '=> 'Portable Network Graphics',
|
7405
|
+
# mjpa => 'Motion-JPEG (format A)',
|
7406
|
+
# mjpb => 'Motion-JPEG (format B)',
|
7407
|
+
# SVQ1 => 'Sorenson video, version 1',
|
7408
|
+
# SVQ3 => 'Sorenson video, version 3',
|
7409
|
+
# mp4v => 'MPEG-4 video',
|
7410
|
+
# 'dvc '=> 'NTSC DV-25 video',
|
7411
|
+
# dvcp => 'PAL DV-25 video',
|
7412
|
+
# 'gif '=> 'Compuserve Graphics Interchange Format',
|
7413
|
+
# h263 => 'H.263 video',
|
7414
|
+
# tiff => 'Tagged Image File Format',
|
7415
|
+
# 'raw '=> 'Uncompressed RGB',
|
7416
|
+
# '2vuY'=> "Uncompressed Y'CbCr, 3x8-bit 4:2:2 (2vuY)",
|
7417
|
+
# 'yuv2'=> "Uncompressed Y'CbCr, 3x8-bit 4:2:2 (yuv2)",
|
7418
|
+
# v308 => "Uncompressed Y'CbCr, 8-bit 4:4:4",
|
7419
|
+
# v408 => "Uncompressed Y'CbCr, 8-bit 4:4:4:4",
|
7420
|
+
# v216 => "Uncompressed Y'CbCr, 10, 12, 14, or 16-bit 4:2:2",
|
7421
|
+
# v410 => "Uncompressed Y'CbCr, 10-bit 4:4:4",
|
7422
|
+
# v210 => "Uncompressed Y'CbCr, 10-bit 4:2:2",
|
7423
|
+
# hvc1 => 'HEVC', #PH
|
7424
|
+
# },
|
7425
|
+
},
|
7426
|
+
# 7 - int16u DataReferenceIndex
|
7427
|
+
10 => {
|
7428
|
+
Name => 'VendorID',
|
7429
|
+
Format => 'string[4]',
|
7430
|
+
RawConv => 'length $val ? $val : undef',
|
7431
|
+
PrintConv => \%vendorID,
|
7432
|
+
SeparateTable => 'VendorID',
|
7433
|
+
},
|
7434
|
+
# 14 - ("Quality" in QuickTime docs) ??
|
7435
|
+
16 => 'SourceImageWidth',
|
7436
|
+
17 => 'SourceImageHeight',
|
7437
|
+
18 => { Name => 'XResolution', Format => 'fixed32u' },
|
7438
|
+
20 => { Name => 'YResolution', Format => 'fixed32u' },
|
7439
|
+
# 24 => 'FrameCount', # always 1 (what good is this?)
|
7440
|
+
25 => {
|
7441
|
+
Name => 'CompressorName',
|
7442
|
+
Format => 'string[32]',
|
7443
|
+
# (sometimes this is a Pascal string, and sometimes it is a C string)
|
7444
|
+
RawConv => q{
|
7445
|
+
$val=substr($val,1,ord($1)) if $val=~/^([\0-\x1f])/ and ord($1)<length($val);
|
7446
|
+
length $val ? $val : undef;
|
7447
|
+
},
|
7448
|
+
},
|
7449
|
+
41 => 'BitDepth',
|
7450
|
+
#
|
7451
|
+
# Observed offsets for child atoms of various CompressorID types:
|
7452
|
+
#
|
7453
|
+
# CompressorID Offset Child atoms
|
7454
|
+
# ----------- ------ ----------------
|
7455
|
+
# avc1 86 avcC, btrt, colr, pasp, fiel, clap, svcC
|
7456
|
+
# mp4v 86 esds, pasp
|
7457
|
+
# s263 86 d263
|
7458
|
+
#
|
7459
|
+
btrt => {
|
7460
|
+
Name => 'BitrateInfo',
|
7461
|
+
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Bitrate' },
|
7462
|
+
},
|
7463
|
+
# Reference for fiel, colr, pasp, clap:
|
7464
|
+
# https://developer.apple.com/library/mac/technotes/tn2162/_index.html#//apple_ref/doc/uid/DTS40013070-CH1-TNTAG9
|
7465
|
+
fiel => {
|
7466
|
+
Name => 'VideoFieldOrder',
|
7467
|
+
ValueConv => 'join(" ", unpack("C*",$val))',
|
7468
|
+
PrintConv => [{
|
7469
|
+
1 => 'Progressive',
|
7470
|
+
2 => '2:1 Interlaced',
|
7471
|
+
}],
|
7472
|
+
},
|
7473
|
+
colr => {
|
7474
|
+
Name => 'ColorRepresentation',
|
7475
|
+
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ColorRep' },
|
7476
|
+
},
|
7477
|
+
pasp => {
|
7478
|
+
Name => 'PixelAspectRatio',
|
7479
|
+
ValueConv => 'join(":", unpack("N*",$val))',
|
7480
|
+
},
|
7481
|
+
clap => {
|
7482
|
+
Name => 'CleanAperture',
|
7483
|
+
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::CleanAperture' },
|
7484
|
+
},
|
7485
|
+
avcC => {
|
7486
|
+
# (see http://thompsonng.blogspot.ca/2010/11/mp4-file-format-part-2.html)
|
7487
|
+
Name => 'AVCConfiguration',
|
7488
|
+
Unknown => 1,
|
7489
|
+
Binary => 1,
|
7490
|
+
},
|
7491
|
+
JPEG => { # (found in CR3 images; used as a flag to identify JpgFromRaw 'vide' stream)
|
7492
|
+
Name => 'JPEGInfo',
|
7493
|
+
# (4 bytes all zero)
|
7494
|
+
Unknown => 1,
|
7495
|
+
Binary => 1,
|
7496
|
+
},
|
7497
|
+
# hvcC - HEVC configuration
|
7498
|
+
# svcC - 7 bytes: 00 00 00 00 ff e0 00
|
7499
|
+
# esds - elementary stream descriptor
|
7500
|
+
# d263
|
7501
|
+
gama => { Name => 'Gamma', Format => 'fixed32u' },
|
7502
|
+
# mjqt - default quantization table for MJPEG
|
7503
|
+
# mjht - default Huffman table for MJPEG
|
7504
|
+
# csgm ? (seen in hevc video)
|
7505
|
+
CMP1 => { # Canon CR3
|
7506
|
+
Name => 'CMP1',
|
7507
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Canon::CMP1' },
|
7508
|
+
},
|
7509
|
+
CDI1 => { # Canon CR3
|
7510
|
+
Name => 'CDI1',
|
7511
|
+
SubDirectory => {
|
7512
|
+
TagTable => 'Image::ExifTool::Canon::CDI1',
|
7513
|
+
Start => 4,
|
7514
|
+
},
|
7515
|
+
},
|
7516
|
+
# JPEG - 4 bytes all 0 (Canon CR3)
|
7517
|
+
# free - (Canon CR3)
|
7518
|
+
#
|
7519
|
+
# spherical video v2 stuff (untested)
|
7520
|
+
#
|
7521
|
+
st3d => {
|
7522
|
+
Name => 'Stereoscopic3D',
|
7523
|
+
Format => 'int8u',
|
7524
|
+
ValueConv => '$val =~ s/.* //; $val', # (remove leading version/flags bytes?)
|
7525
|
+
PrintConv => {
|
7526
|
+
0 => 'Monoscopic',
|
7527
|
+
1 => 'Stereoscopic Top-Bottom',
|
7528
|
+
2 => 'Stereoscopic Left-Right',
|
7529
|
+
3 => 'Stereoscopic Stereo-Custom',
|
7530
|
+
4 => 'Stereoscopic Right-Left',
|
7531
|
+
},
|
7532
|
+
},
|
7533
|
+
sv3d => {
|
7534
|
+
Name => 'SphericalVideo',
|
7535
|
+
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::sv3d' },
|
7536
|
+
},
|
7537
|
+
);
|
7538
|
+
|
7539
|
+
# MP4 hint sample description box (ref 5)
|
7540
|
+
# (ref https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html#//apple_ref/doc/uid/TP40000939-CH205-SW1)
|
7541
|
+
%Image::ExifTool::QuickTime::HintSampleDesc = (
|
7542
|
+
PROCESS_PROC => \&ProcessHybrid,
|
7543
|
+
VARS => { ID_LABEL => 'ID/Index' },
|
7544
|
+
NOTES => 'MP4 hint sample description.',
|
7545
|
+
4 => { Name => 'HintFormat', Format => 'undef[4]' },
|
7546
|
+
# 14 - int16u DataReferenceIndex
|
7547
|
+
16 => { Name => 'HintTrackVersion', Format => 'int16u' },
|
7548
|
+
# 18 - int16u LastCompatibleHintTrackVersion
|
7549
|
+
20 => { Name => 'MaxPacketSize', Format => 'int32u' },
|
7550
|
+
#
|
7551
|
+
# Observed offsets for child atoms of various HintFormat types:
|
7552
|
+
#
|
7553
|
+
# HintFormat Offset Child atoms
|
7554
|
+
# ----------- ------ ----------------
|
7555
|
+
# "rtp " 24 tims
|
7556
|
+
#
|
7557
|
+
tims => { Name => 'RTPTimeScale', Format => 'int32u' },
|
7558
|
+
tsro => { Name => 'TimestampRandomOffset', Format => 'int32u' },
|
7559
|
+
snro => { Name => 'SequenceNumberRandomOffset', Format => 'int32u' },
|
7560
|
+
);
|
7561
|
+
|
7562
|
+
# MP4 metadata sample description box
|
7563
|
+
%Image::ExifTool::QuickTime::MetaSampleDesc = (
|
7564
|
+
PROCESS_PROC => \&ProcessHybrid,
|
7565
|
+
NOTES => 'MP4 metadata sample description.',
|
7566
|
+
4 => {
|
7567
|
+
Name => 'MetaFormat',
|
7568
|
+
Format => 'undef[4]',
|
7569
|
+
RawConv => '$$self{MetaFormat} = $val',
|
7570
|
+
},
|
7571
|
+
8 => { # starts at 8 for MetaFormat eq 'camm', and 17 for 'mett'
|
7572
|
+
Name => 'MetaType',
|
7573
|
+
Format => 'undef[$size-8]',
|
7574
|
+
# may start at various locations!
|
7575
|
+
RawConv => '$$self{MetaType} = ($val=~/(application[^\0]+)/ ? $1 : undef)',
|
7576
|
+
},
|
7577
|
+
#
|
7578
|
+
# Observed offsets for child atoms of various MetaFormat types:
|
7579
|
+
#
|
7580
|
+
# MetaFormat Offset Child atoms
|
7581
|
+
# ----------- ------ ----------------
|
7582
|
+
# mebx 24 keys,btrt,lidp,lidl
|
7583
|
+
# fdsc - -
|
7584
|
+
# gpmd - -
|
7585
|
+
# rtmd - -
|
7586
|
+
# CTMD - -
|
7587
|
+
#
|
7588
|
+
'keys' => { #PH (iPhone7+ hevc)
|
7589
|
+
Name => 'Keys',
|
7590
|
+
SubDirectory => {
|
7591
|
+
TagTable => 'Image::ExifTool::QuickTime::Keys',
|
7592
|
+
ProcessProc => \&ProcessMetaKeys,
|
7593
|
+
},
|
7594
|
+
},
|
7595
|
+
btrt => {
|
7596
|
+
Name => 'BitrateInfo',
|
7597
|
+
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Bitrate' },
|
7598
|
+
},
|
7599
|
+
);
|
7600
|
+
|
7601
|
+
# MP4 generic sample description box
|
7602
|
+
%Image::ExifTool::QuickTime::OtherSampleDesc = (
|
7603
|
+
PROCESS_PROC => \&ProcessHybrid,
|
7604
|
+
4 => {
|
7605
|
+
Name => 'OtherFormat',
|
7606
|
+
Format => 'undef[4]',
|
7607
|
+
RawConv => '$$self{MetaFormat} = $val', # (yes, use MetaFormat for this too)
|
7608
|
+
},
|
7609
|
+
24 => {
|
7610
|
+
Condition => '$$self{MetaFormat} eq "tmcd"',
|
7611
|
+
Name => 'PlaybackFrameRate', # (may differ from recorded FrameRate eg. ../pics/FujiFilmX-H1.mov)
|
7612
|
+
Format => 'rational64u',
|
7613
|
+
},
|
7614
|
+
#
|
7615
|
+
# Observed offsets for child atoms of various OtherFormat types:
|
7616
|
+
#
|
7617
|
+
# OtherFormat Offset Child atoms
|
7618
|
+
# ----------- ------ ----------------
|
7619
|
+
# avc1 86 avcC
|
7620
|
+
# mp4a 36 esds
|
7621
|
+
# mp4s 16 esds
|
7622
|
+
# tmcd 34 name
|
7623
|
+
# data - -
|
7624
|
+
#
|
7625
|
+
ftab => { Name => 'FontTable', Format => 'undef', ValueConv => 'substr($val, 5)' },
|
7626
|
+
name => { Name => 'OtherName', Format => 'undef', ValueConv => 'substr($val, 4)' },
|
7627
|
+
mrlh => { Name => 'MarlinHeader', SubDirectory => { TagTable => 'Image::ExifTool::GM::mrlh' } },
|
7628
|
+
mrlv => { Name => 'MarlinValues', SubDirectory => { TagTable => 'Image::ExifTool::GM::mrlv' } },
|
7629
|
+
mrld => { Name => 'MarlinDictionary',SubDirectory => { TagTable => 'Image::ExifTool::GM::mrld' } },
|
7630
|
+
);
|
7631
|
+
|
7530
7632
|
# AMR decode config box (ref 3)
|
7531
7633
|
%Image::ExifTool::QuickTime::DecodeConfig = (
|
7532
7634
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
@@ -7950,99 +8052,6 @@ my %userDefined = (
|
|
7950
8052
|
# hi32 - seen "00 00 00 04"
|
7951
8053
|
);
|
7952
8054
|
|
7953
|
-
# MP4 hint sample description box (ref 5)
|
7954
|
-
# (ref https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html#//apple_ref/doc/uid/TP40000939-CH205-SW1)
|
7955
|
-
%Image::ExifTool::QuickTime::HintSampleDesc = (
|
7956
|
-
PROCESS_PROC => \&ProcessHybrid,
|
7957
|
-
VARS => { ID_LABEL => 'ID/Index' },
|
7958
|
-
NOTES => 'MP4 hint sample description.',
|
7959
|
-
4 => { Name => 'HintFormat', Format => 'undef[4]' },
|
7960
|
-
# 14 - int16u DataReferenceIndex
|
7961
|
-
16 => { Name => 'HintTrackVersion', Format => 'int16u' },
|
7962
|
-
# 18 - int16u LastCompatibleHintTrackVersion
|
7963
|
-
20 => { Name => 'MaxPacketSize', Format => 'int32u' },
|
7964
|
-
#
|
7965
|
-
# Observed offsets for child atoms of various HintFormat types:
|
7966
|
-
#
|
7967
|
-
# HintFormat Offset Child atoms
|
7968
|
-
# ----------- ------ ----------------
|
7969
|
-
# "rtp " 24 tims
|
7970
|
-
#
|
7971
|
-
tims => { Name => 'RTPTimeScale', Format => 'int32u' },
|
7972
|
-
tsro => { Name => 'TimestampRandomOffset', Format => 'int32u' },
|
7973
|
-
snro => { Name => 'SequenceNumberRandomOffset', Format => 'int32u' },
|
7974
|
-
);
|
7975
|
-
|
7976
|
-
# MP4 metadata sample description box
|
7977
|
-
%Image::ExifTool::QuickTime::MetaSampleDesc = (
|
7978
|
-
PROCESS_PROC => \&ProcessHybrid,
|
7979
|
-
NOTES => 'MP4 metadata sample description.',
|
7980
|
-
4 => {
|
7981
|
-
Name => 'MetaFormat',
|
7982
|
-
Format => 'undef[4]',
|
7983
|
-
RawConv => '$$self{MetaFormat} = $val',
|
7984
|
-
},
|
7985
|
-
8 => { # starts at 8 for MetaFormat eq 'camm', and 17 for 'mett'
|
7986
|
-
Name => 'MetaType',
|
7987
|
-
Format => 'undef[$size-8]',
|
7988
|
-
# may start at various locations!
|
7989
|
-
RawConv => '$$self{MetaType} = ($val=~/(application[^\0]+)/ ? $1 : undef)',
|
7990
|
-
},
|
7991
|
-
#
|
7992
|
-
# Observed offsets for child atoms of various MetaFormat types:
|
7993
|
-
#
|
7994
|
-
# MetaFormat Offset Child atoms
|
7995
|
-
# ----------- ------ ----------------
|
7996
|
-
# mebx 24 keys,btrt,lidp,lidl
|
7997
|
-
# fdsc - -
|
7998
|
-
# gpmd - -
|
7999
|
-
# rtmd - -
|
8000
|
-
# CTMD - -
|
8001
|
-
#
|
8002
|
-
'keys' => { #PH (iPhone7+ hevc)
|
8003
|
-
Name => 'Keys',
|
8004
|
-
SubDirectory => {
|
8005
|
-
TagTable => 'Image::ExifTool::QuickTime::Keys',
|
8006
|
-
ProcessProc => \&ProcessMetaKeys,
|
8007
|
-
},
|
8008
|
-
},
|
8009
|
-
btrt => {
|
8010
|
-
Name => 'BitrateInfo',
|
8011
|
-
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Bitrate' },
|
8012
|
-
},
|
8013
|
-
);
|
8014
|
-
|
8015
|
-
# MP4 generic sample description box
|
8016
|
-
%Image::ExifTool::QuickTime::OtherSampleDesc = (
|
8017
|
-
PROCESS_PROC => \&ProcessHybrid,
|
8018
|
-
4 => {
|
8019
|
-
Name => 'OtherFormat',
|
8020
|
-
Format => 'undef[4]',
|
8021
|
-
RawConv => '$$self{MetaFormat} = $val', # (yes, use MetaFormat for this too)
|
8022
|
-
},
|
8023
|
-
24 => {
|
8024
|
-
Condition => '$$self{MetaFormat} eq "tmcd"',
|
8025
|
-
Name => 'PlaybackFrameRate', # (may differ from recorded FrameRate eg. ../pics/FujiFilmX-H1.mov)
|
8026
|
-
Format => 'rational64u',
|
8027
|
-
},
|
8028
|
-
#
|
8029
|
-
# Observed offsets for child atoms of various OtherFormat types:
|
8030
|
-
#
|
8031
|
-
# OtherFormat Offset Child atoms
|
8032
|
-
# ----------- ------ ----------------
|
8033
|
-
# avc1 86 avcC
|
8034
|
-
# mp4a 36 esds
|
8035
|
-
# mp4s 16 esds
|
8036
|
-
# tmcd 34 name
|
8037
|
-
# data - -
|
8038
|
-
#
|
8039
|
-
ftab => { Name => 'FontTable', Format => 'undef', ValueConv => 'substr($val, 5)' },
|
8040
|
-
name => { Name => 'OtherName', Format => 'undef', ValueConv => 'substr($val, 4)' },
|
8041
|
-
mrlh => { Name => 'MarlinHeader', SubDirectory => { TagTable => 'Image::ExifTool::GM::mrlh' } },
|
8042
|
-
mrlv => { Name => 'MarlinValues', SubDirectory => { TagTable => 'Image::ExifTool::GM::mrlv' } },
|
8043
|
-
mrld => { Name => 'MarlinDictionary',SubDirectory => { TagTable => 'Image::ExifTool::GM::mrld' } },
|
8044
|
-
);
|
8045
|
-
|
8046
8055
|
# MP4 data information box (ref 5)
|
8047
8056
|
%Image::ExifTool::QuickTime::DataInfo = (
|
8048
8057
|
PROCESS_PROC => \&ProcessMOV,
|
@@ -9978,17 +9987,19 @@ sub ProcessMOV($$;$)
|
|
9978
9987
|
my $items = $$et{ItemInfo};
|
9979
9988
|
my ($id, $prop, $docNum, $lowest);
|
9980
9989
|
my $primary = $$et{PrimaryItem} || 0;
|
9990
|
+
my $pitem = $$items{$primary} || { };
|
9991
|
+
$$pitem{RefersTo} or $$pitem{RefersTo} = { };
|
9981
9992
|
ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
|
9982
9993
|
next unless $$items{$id}{Association};
|
9983
9994
|
my $item = $$items{$id};
|
9984
9995
|
foreach $prop (@{$$item{Association}}) {
|
9985
9996
|
next unless $prop == $index;
|
9986
|
-
|
9987
|
-
|
9988
|
-
|
9989
|
-
# to
|
9990
|
-
#
|
9991
|
-
(
|
9997
|
+
my $dont = $dontInherit{$tag} || 0;
|
9998
|
+
if ($id == $primary or (not $dont and
|
9999
|
+
($$item{RefersTo} and $$item{RefersTo}{$primary})) or
|
10000
|
+
# special case to assume this property belongs to the primary
|
10001
|
+
# image if it belongs to an item referred to by the primary
|
10002
|
+
($dont != 1 and $$pitem{RefersTo}{$id}))
|
9992
10003
|
{
|
9993
10004
|
# this is associated with the primary item or an item describing
|
9994
10005
|
# the primary item, so consider this part of the main document
|
@@ -111,7 +111,7 @@ 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
|
114
|
+
currently reads 103 different types of timed GPS metadata from video files.
|
115
115
|
},
|
116
116
|
VARS => { NO_ID => 1 },
|
117
117
|
GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
|
@@ -2208,7 +2208,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
2208
2208
|
unpack('x48V6a1a1a1x1V4', $$dataPt);
|
2209
2209
|
if (substr($$dataPt, 16, 3) eq 'IQS') {
|
2210
2210
|
$debug and $et->FoundTag(GPSType => 16);
|
2211
|
-
#
|
2211
|
+
# IQS variant (ref PH)
|
2212
2212
|
# header looks like this in my sample:
|
2213
2213
|
# 0000: 00 00 80 00 66 72 65 65 47 50 53 20 4c 00 00 00 [....freeGPS L...]
|
2214
2214
|
# 0010: 49 51 53 5f 41 37 5f 32 30 31 35 30 34 31 37 00 [IQS_A7_20150417.]
|
@@ -2219,12 +2219,26 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
2219
2219
|
$spd = Get32s($dataPt, 0x54) / 100 * $mpsToKph;
|
2220
2220
|
$alt = GetFloat($dataPt, 0x58) / 1000; # (NC)
|
2221
2221
|
} else {
|
2222
|
-
$debug and $et->FoundTag(GPSType => 17);
|
2223
2222
|
$lat = GetFloat($dataPt, 0x4c);
|
2224
2223
|
$lon = GetFloat($dataPt, 0x50);
|
2225
2224
|
$spd = GetFloat($dataPt, 0x54) * $knotsToKph;
|
2226
|
-
$trk = GetFloat($dataPt, 0x58);
|
2227
|
-
#
|
2225
|
+
$trk = GetFloat($dataPt, 0x58); # (NC, may be GPSImageDirection)
|
2226
|
+
# Rexing V1-4k dashcam scales the lat/lon
|
2227
|
+
# (recognize this dashcam by the KodakVersion, "3.01.054" for my sample)
|
2228
|
+
# 0000: 00 00 80 00 66 72 65 65 47 50 53 20 4c 00 00 00 [....freeGPS L...]
|
2229
|
+
# 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
2230
|
+
# 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
2231
|
+
# 0030: 0e 00 00 00 22 00 00 00 28 00 00 00 14 00 00 00 [...."...(.......]
|
2232
|
+
# 0040: 02 00 00 00 16 00 00 00 41 4e 57 00 e9 7e 90 43 [........ANW..~.C]
|
2233
|
+
# 0050: 48 76 17 45 0c 02 48 42 14 6e 85 43 00 00 00 00 [Hv.E..HB.n.C....]
|
2234
|
+
if ($$et{KodakVersion} and $$et{KodakVersion} eq '3.01.054') {
|
2235
|
+
$debug and $et->FoundTag(GPSType => '17b');
|
2236
|
+
$lat = ($lat - 187.982162849635) / 3;
|
2237
|
+
$lon = ($lon - 2199.19873715495) / 2;
|
2238
|
+
$ddd = 1;
|
2239
|
+
} else {
|
2240
|
+
$debug and $et->FoundTag(GPSType => 17);
|
2241
|
+
}
|
2228
2242
|
}
|
2229
2243
|
if ($dirLen >= 0xb0) {
|
2230
2244
|
# lat/lon also stored as doubles by Transcend Driver Pro 230 (ref PH)
|