exiftool_vendored 13.16.0 → 13.18.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.
@@ -48,7 +48,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
48
48
  use Image::ExifTool::Exif;
49
49
  use Image::ExifTool::GPS;
50
50
 
51
- $VERSION = '3.11';
51
+ $VERSION = '3.12';
52
52
 
53
53
  sub ProcessMOV($$;$);
54
54
  sub ProcessKeys($$$);
@@ -510,7 +510,7 @@ my %hashBox = ( vide => { %eeStd }, soun => { %eeStd } );
510
510
  # used, but others have been checked against all available sample files and may be
511
511
  # useful in the future if the names are used for different boxes on other locations)
512
512
  my %eeBox = (
513
- # (note: vide is only processed if specific atoms exist in the VideoSampleDesc)
513
+ # (note: vide is only processed if specific atoms exist in the VisualSampleDesc)
514
514
  vide => { %eeStd, JPEG => 'stsd' },
515
515
  text => { %eeStd },
516
516
  meta => { %eeStd },
@@ -1005,7 +1005,7 @@ my %userDefined = (
1005
1005
  NOTES => 'Tags used in QTIF QuickTime Image Files.',
1006
1006
  idsc => {
1007
1007
  Name => 'ImageDescription',
1008
- SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ImageDesc' },
1008
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::VisualSampleDesc' },
1009
1009
  },
1010
1010
  idat => {
1011
1011
  Name => 'ImageData',
@@ -1017,158 +1017,6 @@ my %userDefined = (
1017
1017
  },
1018
1018
  );
1019
1019
 
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
1020
  # 'sv3d' atom information (ref https://github.com/google/spatial-media/blob/master/docs/spherical-video-v2-rfc.md)
1173
1021
  %Image::ExifTool::QuickTime::sv3d = (
1174
1022
  PROCESS_PROC => \&ProcessMOV,
@@ -2227,7 +2075,7 @@ my %userDefined = (
2227
2075
  ValueConvInv => 'pack("H*",$val)',
2228
2076
  },
2229
2077
  # SETT? 12 bytes (Hero4)
2230
- # MUID? 32 bytes (Hero4, starts with serial number hash)
2078
+ MUID => { Name => 'MediaUID', ValueConv => 'unpack("H*", $val)' },
2231
2079
  # HMMT? 404 bytes (Hero4, all zero)
2232
2080
  # BCID? 26 bytes (Hero5, all zero), 36 bytes GoPro Max
2233
2081
  # GUMI? 16 bytes (Hero5)
@@ -3001,7 +2849,9 @@ my %userDefined = (
3001
2849
  colr => [{
3002
2850
  Name => 'ICC_Profile',
3003
2851
  Condition => '$$valPt =~ /^(prof|rICC)/',
3004
- Permanent => 0, # (in QuickTime, this writes a zero-length box instead of deleting)
2852
+ # (don't do this because Apple Preview won't display an HEIC with a 0-length profile)
2853
+ # Permanent => 0, # (in QuickTime, this writes a zero-length box instead of deleting)
2854
+ Permanent => 1,
3005
2855
  SubDirectory => {
3006
2856
  TagTable => 'Image::ExifTool::ICC_Profile::Main',
3007
2857
  Start => 4,
@@ -7324,10 +7174,10 @@ my %userDefined = (
7324
7174
  ProcessProc => \&ProcessSampleDesc,
7325
7175
  },
7326
7176
  },{
7327
- Name => 'VideoSampleDesc',
7177
+ Name => 'VisualSampleDesc',
7328
7178
  Condition => '$$self{HandlerType} and $$self{HandlerType} eq "vide"',
7329
7179
  SubDirectory => {
7330
- TagTable => 'Image::ExifTool::QuickTime::ImageDesc',
7180
+ TagTable => 'Image::ExifTool::QuickTime::VisualSampleDesc',
7331
7181
  ProcessProc => \&ProcessSampleDesc,
7332
7182
  },
7333
7183
  },{
@@ -7463,6 +7313,7 @@ my %userDefined = (
7463
7313
  # see this link for print conversions (not complete):
7464
7314
  # https://github.com/yannickcr/brooser/blob/master/php/librairies/getid3/module.audio-video.quicktime.php
7465
7315
  },
7316
+ # 14 - int16u DataReferenceIndex
7466
7317
  20 => { #PH
7467
7318
  Name => 'AudioVendorID',
7468
7319
  Condition => '$$self{AudioFormat} ne "mp4s"',
@@ -7527,6 +7378,252 @@ my %userDefined = (
7527
7378
  # dapa - ? 203 bytes
7528
7379
  );
7529
7380
 
7381
+ # video and image sample description data block
7382
+ %Image::ExifTool::QuickTime::VisualSampleDesc = (
7383
+ PROCESS_PROC => \&ProcessHybrid,
7384
+ VARS => { ID_LABEL => 'ID/Index' },
7385
+ GROUPS => { 2 => 'Image' },
7386
+ FORMAT => 'int16u',
7387
+ 2 => {
7388
+ Name => 'CompressorID',
7389
+ Format => 'string[4]',
7390
+ # not very useful since this isn't a complete list and name is given below
7391
+ # # ref http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html
7392
+ # PrintConv => {
7393
+ # cvid => 'Cinepak',
7394
+ # jpeg => 'JPEG',
7395
+ # 'smc '=> 'Graphics',
7396
+ # 'rle '=> 'Animation',
7397
+ # rpza => 'Apple Video',
7398
+ # kpcd => 'Kodak Photo CD',
7399
+ # 'png '=> 'Portable Network Graphics',
7400
+ # mjpa => 'Motion-JPEG (format A)',
7401
+ # mjpb => 'Motion-JPEG (format B)',
7402
+ # SVQ1 => 'Sorenson video, version 1',
7403
+ # SVQ3 => 'Sorenson video, version 3',
7404
+ # mp4v => 'MPEG-4 video',
7405
+ # 'dvc '=> 'NTSC DV-25 video',
7406
+ # dvcp => 'PAL DV-25 video',
7407
+ # 'gif '=> 'Compuserve Graphics Interchange Format',
7408
+ # h263 => 'H.263 video',
7409
+ # tiff => 'Tagged Image File Format',
7410
+ # 'raw '=> 'Uncompressed RGB',
7411
+ # '2vuY'=> "Uncompressed Y'CbCr, 3x8-bit 4:2:2 (2vuY)",
7412
+ # 'yuv2'=> "Uncompressed Y'CbCr, 3x8-bit 4:2:2 (yuv2)",
7413
+ # v308 => "Uncompressed Y'CbCr, 8-bit 4:4:4",
7414
+ # v408 => "Uncompressed Y'CbCr, 8-bit 4:4:4:4",
7415
+ # v216 => "Uncompressed Y'CbCr, 10, 12, 14, or 16-bit 4:2:2",
7416
+ # v410 => "Uncompressed Y'CbCr, 10-bit 4:4:4",
7417
+ # v210 => "Uncompressed Y'CbCr, 10-bit 4:2:2",
7418
+ # hvc1 => 'HEVC', #PH
7419
+ # },
7420
+ },
7421
+ # 7 - int16u DataReferenceIndex
7422
+ 10 => {
7423
+ Name => 'VendorID',
7424
+ Format => 'string[4]',
7425
+ RawConv => 'length $val ? $val : undef',
7426
+ PrintConv => \%vendorID,
7427
+ SeparateTable => 'VendorID',
7428
+ },
7429
+ # 14 - ("Quality" in QuickTime docs) ??
7430
+ 16 => 'SourceImageWidth',
7431
+ 17 => 'SourceImageHeight',
7432
+ 18 => { Name => 'XResolution', Format => 'fixed32u' },
7433
+ 20 => { Name => 'YResolution', Format => 'fixed32u' },
7434
+ # 24 => 'FrameCount', # always 1 (what good is this?)
7435
+ 25 => {
7436
+ Name => 'CompressorName',
7437
+ Format => 'string[32]',
7438
+ # (sometimes this is a Pascal string, and sometimes it is a C string)
7439
+ RawConv => q{
7440
+ $val=substr($val,1,ord($1)) if $val=~/^([\0-\x1f])/ and ord($1)<length($val);
7441
+ length $val ? $val : undef;
7442
+ },
7443
+ },
7444
+ 41 => 'BitDepth',
7445
+ #
7446
+ # Observed offsets for child atoms of various CompressorID types:
7447
+ #
7448
+ # CompressorID Offset Child atoms
7449
+ # ----------- ------ ----------------
7450
+ # avc1 86 avcC, btrt, colr, pasp, fiel, clap, svcC
7451
+ # mp4v 86 esds, pasp
7452
+ # s263 86 d263
7453
+ #
7454
+ btrt => {
7455
+ Name => 'BitrateInfo',
7456
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Bitrate' },
7457
+ },
7458
+ # Reference for fiel, colr, pasp, clap:
7459
+ # https://developer.apple.com/library/mac/technotes/tn2162/_index.html#//apple_ref/doc/uid/DTS40013070-CH1-TNTAG9
7460
+ fiel => {
7461
+ Name => 'VideoFieldOrder',
7462
+ ValueConv => 'join(" ", unpack("C*",$val))',
7463
+ PrintConv => [{
7464
+ 1 => 'Progressive',
7465
+ 2 => '2:1 Interlaced',
7466
+ }],
7467
+ },
7468
+ colr => {
7469
+ Name => 'ColorRepresentation',
7470
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ColorRep' },
7471
+ },
7472
+ pasp => {
7473
+ Name => 'PixelAspectRatio',
7474
+ ValueConv => 'join(":", unpack("N*",$val))',
7475
+ },
7476
+ clap => {
7477
+ Name => 'CleanAperture',
7478
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::CleanAperture' },
7479
+ },
7480
+ avcC => {
7481
+ # (see http://thompsonng.blogspot.ca/2010/11/mp4-file-format-part-2.html)
7482
+ Name => 'AVCConfiguration',
7483
+ Unknown => 1,
7484
+ Binary => 1,
7485
+ },
7486
+ JPEG => { # (found in CR3 images; used as a flag to identify JpgFromRaw 'vide' stream)
7487
+ Name => 'JPEGInfo',
7488
+ # (4 bytes all zero)
7489
+ Unknown => 1,
7490
+ Binary => 1,
7491
+ },
7492
+ # hvcC - HEVC configuration
7493
+ # svcC - 7 bytes: 00 00 00 00 ff e0 00
7494
+ # esds - elementary stream descriptor
7495
+ # d263
7496
+ gama => { Name => 'Gamma', Format => 'fixed32u' },
7497
+ # mjqt - default quantization table for MJPEG
7498
+ # mjht - default Huffman table for MJPEG
7499
+ # csgm ? (seen in hevc video)
7500
+ CMP1 => { # Canon CR3
7501
+ Name => 'CMP1',
7502
+ SubDirectory => { TagTable => 'Image::ExifTool::Canon::CMP1' },
7503
+ },
7504
+ CDI1 => { # Canon CR3
7505
+ Name => 'CDI1',
7506
+ SubDirectory => {
7507
+ TagTable => 'Image::ExifTool::Canon::CDI1',
7508
+ Start => 4,
7509
+ },
7510
+ },
7511
+ # JPEG - 4 bytes all 0 (Canon CR3)
7512
+ # free - (Canon CR3)
7513
+ #
7514
+ # spherical video v2 stuff (untested)
7515
+ #
7516
+ st3d => {
7517
+ Name => 'Stereoscopic3D',
7518
+ Format => 'int8u',
7519
+ ValueConv => '$val =~ s/.* //; $val', # (remove leading version/flags bytes?)
7520
+ PrintConv => {
7521
+ 0 => 'Monoscopic',
7522
+ 1 => 'Stereoscopic Top-Bottom',
7523
+ 2 => 'Stereoscopic Left-Right',
7524
+ 3 => 'Stereoscopic Stereo-Custom',
7525
+ 4 => 'Stereoscopic Right-Left',
7526
+ },
7527
+ },
7528
+ sv3d => {
7529
+ Name => 'SphericalVideo',
7530
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::sv3d' },
7531
+ },
7532
+ );
7533
+
7534
+ # MP4 hint sample description box (ref 5)
7535
+ # (ref https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html#//apple_ref/doc/uid/TP40000939-CH205-SW1)
7536
+ %Image::ExifTool::QuickTime::HintSampleDesc = (
7537
+ PROCESS_PROC => \&ProcessHybrid,
7538
+ VARS => { ID_LABEL => 'ID/Index' },
7539
+ NOTES => 'MP4 hint sample description.',
7540
+ 4 => { Name => 'HintFormat', Format => 'undef[4]' },
7541
+ # 14 - int16u DataReferenceIndex
7542
+ 16 => { Name => 'HintTrackVersion', Format => 'int16u' },
7543
+ # 18 - int16u LastCompatibleHintTrackVersion
7544
+ 20 => { Name => 'MaxPacketSize', Format => 'int32u' },
7545
+ #
7546
+ # Observed offsets for child atoms of various HintFormat types:
7547
+ #
7548
+ # HintFormat Offset Child atoms
7549
+ # ----------- ------ ----------------
7550
+ # "rtp " 24 tims
7551
+ #
7552
+ tims => { Name => 'RTPTimeScale', Format => 'int32u' },
7553
+ tsro => { Name => 'TimestampRandomOffset', Format => 'int32u' },
7554
+ snro => { Name => 'SequenceNumberRandomOffset', Format => 'int32u' },
7555
+ );
7556
+
7557
+ # MP4 metadata sample description box
7558
+ %Image::ExifTool::QuickTime::MetaSampleDesc = (
7559
+ PROCESS_PROC => \&ProcessHybrid,
7560
+ NOTES => 'MP4 metadata sample description.',
7561
+ 4 => {
7562
+ Name => 'MetaFormat',
7563
+ Format => 'undef[4]',
7564
+ RawConv => '$$self{MetaFormat} = $val',
7565
+ },
7566
+ 8 => { # starts at 8 for MetaFormat eq 'camm', and 17 for 'mett'
7567
+ Name => 'MetaType',
7568
+ Format => 'undef[$size-8]',
7569
+ # may start at various locations!
7570
+ RawConv => '$$self{MetaType} = ($val=~/(application[^\0]+)/ ? $1 : undef)',
7571
+ },
7572
+ #
7573
+ # Observed offsets for child atoms of various MetaFormat types:
7574
+ #
7575
+ # MetaFormat Offset Child atoms
7576
+ # ----------- ------ ----------------
7577
+ # mebx 24 keys,btrt,lidp,lidl
7578
+ # fdsc - -
7579
+ # gpmd - -
7580
+ # rtmd - -
7581
+ # CTMD - -
7582
+ #
7583
+ 'keys' => { #PH (iPhone7+ hevc)
7584
+ Name => 'Keys',
7585
+ SubDirectory => {
7586
+ TagTable => 'Image::ExifTool::QuickTime::Keys',
7587
+ ProcessProc => \&ProcessMetaKeys,
7588
+ },
7589
+ },
7590
+ btrt => {
7591
+ Name => 'BitrateInfo',
7592
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Bitrate' },
7593
+ },
7594
+ );
7595
+
7596
+ # MP4 generic sample description box
7597
+ %Image::ExifTool::QuickTime::OtherSampleDesc = (
7598
+ PROCESS_PROC => \&ProcessHybrid,
7599
+ 4 => {
7600
+ Name => 'OtherFormat',
7601
+ Format => 'undef[4]',
7602
+ RawConv => '$$self{MetaFormat} = $val', # (yes, use MetaFormat for this too)
7603
+ },
7604
+ 24 => {
7605
+ Condition => '$$self{MetaFormat} eq "tmcd"',
7606
+ Name => 'PlaybackFrameRate', # (may differ from recorded FrameRate eg. ../pics/FujiFilmX-H1.mov)
7607
+ Format => 'rational64u',
7608
+ },
7609
+ #
7610
+ # Observed offsets for child atoms of various OtherFormat types:
7611
+ #
7612
+ # OtherFormat Offset Child atoms
7613
+ # ----------- ------ ----------------
7614
+ # avc1 86 avcC
7615
+ # mp4a 36 esds
7616
+ # mp4s 16 esds
7617
+ # tmcd 34 name
7618
+ # data - -
7619
+ #
7620
+ ftab => { Name => 'FontTable', Format => 'undef', ValueConv => 'substr($val, 5)' },
7621
+ name => { Name => 'OtherName', Format => 'undef', ValueConv => 'substr($val, 4)' },
7622
+ mrlh => { Name => 'MarlinHeader', SubDirectory => { TagTable => 'Image::ExifTool::GM::mrlh' } },
7623
+ mrlv => { Name => 'MarlinValues', SubDirectory => { TagTable => 'Image::ExifTool::GM::mrlv' } },
7624
+ mrld => { Name => 'MarlinDictionary',SubDirectory => { TagTable => 'Image::ExifTool::GM::mrld' } },
7625
+ );
7626
+
7530
7627
  # AMR decode config box (ref 3)
7531
7628
  %Image::ExifTool::QuickTime::DecodeConfig = (
7532
7629
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
@@ -7950,99 +8047,6 @@ my %userDefined = (
7950
8047
  # hi32 - seen "00 00 00 04"
7951
8048
  );
7952
8049
 
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
8050
  # MP4 data information box (ref 5)
8047
8051
  %Image::ExifTool::QuickTime::DataInfo = (
8048
8052
  PROCESS_PROC => \&ProcessMOV,
@@ -9856,6 +9860,7 @@ sub ProcessMOV($$;$)
9856
9860
  $size -= 8;
9857
9861
  }
9858
9862
  if ($validate) {
9863
+ $et->Warn("Invalid 'wide' atom size") if $tag eq 'wide' and $size;
9859
9864
  $$et{ValidatePath} or $$et{ValidatePath} = { };
9860
9865
  my $path = join('-', @{$$et{PATH}}, $tag);
9861
9866
  $path =~ s/-Track-/-$$et{SET_GROUP1}-/ if $$et{SET_GROUP1};
@@ -1002,6 +1002,10 @@ my %formatMinMax = (
1002
1002
  '0x0a20-name' => 'DualCameraImageName', # ("FlipPhoto_002")
1003
1003
  '0x0a20' => { Name => 'DualCameraImage', Groups => { 2 => 'Preview' }, Binary => 1 },
1004
1004
  '0x0a30-name' => 'EmbeddedVideoType', # ("MotionPhoto_Data")
1005
+ # Note: A duplicate of this video may be extracted as MotionPhotoVideo from
1006
+ # the Google trailer, but keep this copy named as EmbeddedVideoFile
1007
+ # for backward compatibility and to avoid confusion due to extracting
1008
+ # multiple tags with the same name
1005
1009
  '0x0a30' => { Name => 'EmbeddedVideoFile', Groups => { 2 => 'Video' }, Binary => 1 }, #forum7161
1006
1010
  # 0x0a41-name - seen 'BackupRestore_Data' #forum16086
1007
1011
  # 0x0aa1-name - seen 'MCC_Data'
@@ -1719,7 +1719,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1719
1719
  },
1720
1720
  },{
1721
1721
  Name => 'Tag9050c',
1722
- Condition => '$$self{Model} =~ /^(ILCE-(1|7M4|7RM5|7SM3)|ILME-FX3)/',
1722
+ Condition => '$$self{Model} =~ /^(ILCE-(1\b|7M4|7RM5|7SM3)|ILME-FX3)/',
1723
1723
  SubDirectory => {
1724
1724
  TagTable => 'Image::ExifTool::Sony::Tag9050c',
1725
1725
  ByteOrder => 'LittleEndian',