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.
@@ -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
- my %dontInherit = (
491
- ispe => 1, # size of parent may be different
492
- hvcC => 1, # (likely redundant)
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 VideoSampleDesc)
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::ImageDesc' },
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
- # MUID? 32 bytes (Hero4, starts with serial number hash)
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
- WriteHook => \&ParseItemPropAssoc,
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
- Permanent => 0, # (in QuickTime, this writes a zero-length box instead of deleting)
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 => 'VideoSampleDesc',
7182
+ Name => 'VisualSampleDesc',
7328
7183
  Condition => '$$self{HandlerType} and $$self{HandlerType} eq "vide"',
7329
7184
  SubDirectory => {
7330
- TagTable => 'Image::ExifTool::QuickTime::ImageDesc',
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
- if ($id == $primary or (not $dontInherit{$tag} and
9987
- (($$item{RefersTo} and $$item{RefersTo}{$primary}) or
9988
- # hack: assume Item 1 is from the main image (eg. hvc1 data)
9989
- # to hack the case where the primary item (ie. main image)
9990
- # doesn't directly reference this property
9991
- (not $$item{RefersTo} and $id == 1))))
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 100 different types of timed GPS metadata from video files.
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
- # Type 3b (ref PH)
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
- # ($trk is not confirmed; may be GPSImageDirection, ref PH)
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)