exiftool_vendored 12.42.0 → 12.52.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/Changes +226 -6
- data/bin/MANIFEST +14 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +45 -44
- data/bin/config_files/acdsee.config +2 -1
- data/bin/config_files/frameCount.config +56 -0
- data/bin/config_files/tiff_version.config +1 -1
- data/bin/exiftool +116 -97
- data/bin/fmt_files/gpx.fmt +3 -0
- data/bin/fmt_files/gpx_wpt.fmt +3 -0
- data/bin/lib/Image/ExifTool/Apple.pm +16 -3
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +23 -12
- data/bin/lib/Image/ExifTool/Canon.pm +66 -37
- data/bin/lib/Image/ExifTool/CanonRaw.pm +8 -1
- data/bin/lib/Image/ExifTool/CanonVRD.pm +7 -8
- data/bin/lib/Image/ExifTool/Casio.pm +3 -3
- data/bin/lib/Image/ExifTool/DJI.pm +2 -1
- data/bin/lib/Image/ExifTool/DarwinCore.pm +13 -1
- data/bin/lib/Image/ExifTool/EXE.pm +9 -1
- data/bin/lib/Image/ExifTool/Exif.pm +17 -12
- data/bin/lib/Image/ExifTool/FLAC.pm +17 -3
- data/bin/lib/Image/ExifTool/FLIR.pm +9 -7
- data/bin/lib/Image/ExifTool/FlashPix.pm +26 -3
- data/bin/lib/Image/ExifTool/FujiFilm.pm +51 -4
- data/bin/lib/Image/ExifTool/GPS.pm +31 -5
- data/bin/lib/Image/ExifTool/Geotag.pm +36 -8
- data/bin/lib/Image/ExifTool/ICC_Profile.pm +3 -2
- data/bin/lib/Image/ExifTool/ICO.pm +143 -0
- data/bin/lib/Image/ExifTool/ID3.pm +6 -6
- data/bin/lib/Image/ExifTool/IPTC.pm +5 -1
- data/bin/lib/Image/ExifTool/JPEG.pm +1 -0
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +24 -3
- data/bin/lib/Image/ExifTool/LNK.pm +5 -2
- data/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/fr.pm +6015 -759
- data/bin/lib/Image/ExifTool/Lang/sk.pm +1927 -0
- data/bin/lib/Image/ExifTool/M2TS.pm +98 -8
- data/bin/lib/Image/ExifTool/MIE.pm +9 -3
- data/bin/lib/Image/ExifTool/MISB.pm +494 -0
- data/bin/lib/Image/ExifTool/MakerNotes.pm +3 -1
- data/bin/lib/Image/ExifTool/Matroska.pm +272 -48
- data/bin/lib/Image/ExifTool/Motorola.pm +8 -2
- data/bin/lib/Image/ExifTool/Nikon.pm +746 -382
- data/bin/lib/Image/ExifTool/NikonCustom.pm +139 -106
- data/bin/lib/Image/ExifTool/NikonSettings.pm +5 -3
- data/bin/lib/Image/ExifTool/Olympus.pm +6 -4
- data/bin/lib/Image/ExifTool/PNG.pm +8 -1
- data/bin/lib/Image/ExifTool/Panasonic.pm +21 -4
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +25 -5
- data/bin/lib/Image/ExifTool/Parrot.pm +96 -2
- data/bin/lib/Image/ExifTool/Pentax.pm +7 -2
- data/bin/lib/Image/ExifTool/Photoshop.pm +29 -3
- data/bin/lib/Image/ExifTool/QuickTime.pm +166 -13
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +161 -22
- data/bin/lib/Image/ExifTool/README +15 -4
- data/bin/lib/Image/ExifTool/RIFF.pm +106 -9
- data/bin/lib/Image/ExifTool/Samsung.pm +2 -2
- data/bin/lib/Image/ExifTool/Sigma.pm +27 -1
- data/bin/lib/Image/ExifTool/SigmaRaw.pm +37 -13
- data/bin/lib/Image/ExifTool/Sony.pm +75 -47
- data/bin/lib/Image/ExifTool/TagInfoXML.pm +13 -6
- data/bin/lib/Image/ExifTool/TagLookup.pm +4791 -4519
- data/bin/lib/Image/ExifTool/TagNames.pod +2056 -1446
- data/bin/lib/Image/ExifTool/Text.pm +3 -4
- data/bin/lib/Image/ExifTool/Torrent.pm +2 -3
- data/bin/lib/Image/ExifTool/Validate.pm +3 -3
- data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +7 -0
- data/bin/lib/Image/ExifTool/WriteExif.pl +100 -23
- data/bin/lib/Image/ExifTool/WriteIPTC.pl +2 -6
- data/bin/lib/Image/ExifTool/WritePhotoshop.pl +5 -5
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +12 -7
- data/bin/lib/Image/ExifTool/WriteRIFF.pl +359 -0
- data/bin/lib/Image/ExifTool/WriteXMP.pl +15 -1
- data/bin/lib/Image/ExifTool/Writer.pl +46 -18
- data/bin/lib/Image/ExifTool/XMP.pm +78 -59
- data/bin/lib/Image/ExifTool/XMP2.pl +19 -4
- data/bin/lib/Image/ExifTool/ZIP.pm +19 -7
- data/bin/lib/Image/ExifTool.pm +146 -38
- data/bin/lib/Image/ExifTool.pod +83 -69
- data/bin/perl-Image-ExifTool.spec +43 -43
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +10 -4
@@ -6,6 +6,7 @@
|
|
6
6
|
# Revisions: 05/26/2010 - P. Harvey Created
|
7
7
|
#
|
8
8
|
# References: 1) http://www.matroska.org/technical/specs/index.html
|
9
|
+
# 2) https://www.matroska.org/technical/tagging.html
|
9
10
|
#------------------------------------------------------------------------------
|
10
11
|
|
11
12
|
package Image::ExifTool::Matroska;
|
@@ -14,10 +15,26 @@ use strict;
|
|
14
15
|
use vars qw($VERSION);
|
15
16
|
use Image::ExifTool qw(:DataAccess :Utils);
|
16
17
|
|
17
|
-
$VERSION = '1.
|
18
|
+
$VERSION = '1.13';
|
19
|
+
|
20
|
+
sub HandleStruct($$;$$$$);
|
18
21
|
|
19
22
|
my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
20
23
|
|
24
|
+
my %dateInfo = (
|
25
|
+
Groups => { 2 => 'Time' },
|
26
|
+
# the spec says to use "-" as a date separator, but my only sample uses ":", so
|
27
|
+
# convert to ":" if necessary, and avoid translating all "-" in case someone wants
|
28
|
+
# to include a negative time zone (although the spec doesn't mention time zones)
|
29
|
+
ValueConv => '$val =~ s/^(\d{4})-(\d{2})-/$1:$2:/; $val',
|
30
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
31
|
+
);
|
32
|
+
|
33
|
+
my %uidInfo = (
|
34
|
+
Format => 'string',
|
35
|
+
ValueConv => 'unpack("H*",$val)'
|
36
|
+
);
|
37
|
+
|
21
38
|
# Matroska tags
|
22
39
|
# Note: The tag ID's in the Matroska documentation include the length designation
|
23
40
|
# (the upper bits), which is not included in the tag ID's below
|
@@ -27,8 +44,10 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
27
44
|
NOTES => q{
|
28
45
|
The following tags are extracted from Matroska multimedia container files.
|
29
46
|
This container format is used by file types such as MKA, MKV, MKS and WEBM.
|
30
|
-
For speed, ExifTool extracts tags only up to the first Cluster
|
31
|
-
L<Verbose|../ExifTool.html#Verbose> (-v)
|
47
|
+
For speed, by default ExifTool extracts tags only up to the first Cluster.
|
48
|
+
However, the L<Verbose|../ExifTool.html#Verbose> (-v) and L<Unknown|../ExifTool.html#Unknown> = 2 (-U) options force processing of
|
49
|
+
Cluster data, and the L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> (-ee) option skips over Clusters to
|
50
|
+
read subsequent tags. See
|
32
51
|
L<http://www.matroska.org/technical/specs/index.html> for the official
|
33
52
|
Matroska specification.
|
34
53
|
},
|
@@ -56,7 +75,7 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
56
75
|
#
|
57
76
|
# General
|
58
77
|
#
|
59
|
-
0x3f => { Name => 'CRC-32',
|
78
|
+
0x3f => { Name => 'CRC-32', Format => 'unsigned', Unknown => 1 },
|
60
79
|
0x6c => { Name => 'Void', NoSave => 1, Unknown => 1 },
|
61
80
|
#
|
62
81
|
# Signature
|
@@ -102,18 +121,18 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
102
121
|
Name => 'Info',
|
103
122
|
SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
|
104
123
|
},
|
105
|
-
0x33a4 => { Name => 'SegmentUID',
|
124
|
+
0x33a4 => { Name => 'SegmentUID', %uidInfo, Unknown => 1 },
|
106
125
|
0x3384 => { Name => 'SegmentFileName', Format => 'utf8' },
|
107
|
-
0x1cb923 => { Name => 'PrevUID',
|
126
|
+
0x1cb923 => { Name => 'PrevUID', %uidInfo, Unknown => 1 },
|
108
127
|
0x1c83ab => { Name => 'PrevFileName', Format => 'utf8' },
|
109
|
-
0x1eb923 => { Name => 'NextUID',
|
128
|
+
0x1eb923 => { Name => 'NextUID', %uidInfo, Unknown => 1 },
|
110
129
|
0x1e83bb => { Name => 'NextFileName', Format => 'utf8' },
|
111
130
|
0x0444 => { Name => 'SegmentFamily', Binary => 1, Unknown => 1 },
|
112
131
|
0x2924 => {
|
113
132
|
Name => 'ChapterTranslate',
|
114
133
|
SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
|
115
134
|
},
|
116
|
-
0x29fc => { Name => 'ChapterTranslateEditionUID',
|
135
|
+
0x29fc => { Name => 'ChapterTranslateEditionUID', %uidInfo, Unknown => 1 },
|
117
136
|
0x29bf => {
|
118
137
|
Name => 'ChapterTranslateCodec',
|
119
138
|
Format => 'unsigned',
|
@@ -226,7 +245,7 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
226
245
|
SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
|
227
246
|
},
|
228
247
|
0x57 => { Name => 'TrackNumber', Format => 'unsigned' },
|
229
|
-
0x33c5 => { Name => 'TrackUID',
|
248
|
+
0x33c5 => { Name => 'TrackUID', %uidInfo },
|
230
249
|
0x03 => {
|
231
250
|
Name => 'TrackType',
|
232
251
|
Format => 'unsigned',
|
@@ -269,10 +288,11 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
269
288
|
}
|
270
289
|
],
|
271
290
|
0x3314f => { Name => 'TrackTimecodeScale',Format => 'float' },
|
272
|
-
0x137f => { Name => 'TrackOffset',
|
291
|
+
0x137f => { Name => 'TrackOffset', Format => 'signed', Unknown => 1 },
|
273
292
|
0x15ee => { Name => 'MaxBlockAdditionID',Format => 'unsigned', Unknown => 1 },
|
274
|
-
0x136e => { Name => 'TrackName',
|
275
|
-
0x2b59c => { Name => 'TrackLanguage',
|
293
|
+
0x136e => { Name => 'TrackName', Format => 'utf8' },
|
294
|
+
0x2b59c => { Name => 'TrackLanguage', Format => 'string' },
|
295
|
+
0x2b59d => { Name => 'TrackLanguageIETF', Format => 'string' },
|
276
296
|
0x06 => [
|
277
297
|
{
|
278
298
|
Name => 'VideoCodecID',
|
@@ -302,7 +322,7 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
302
322
|
Format => 'utf8',
|
303
323
|
}
|
304
324
|
],
|
305
|
-
0x3446 => { Name => 'TrackAttachmentUID'
|
325
|
+
0x3446 => { Name => 'TrackAttachmentUID',%uidInfo },
|
306
326
|
0x1a9697=>{ Name => 'CodecSettings', Format => 'utf8' },
|
307
327
|
0x1b4040=>{ Name => 'CodecInfoURL', Format => 'string' },
|
308
328
|
0x6b240 =>{ Name => 'CodecDownloadURL', Format => 'string' },
|
@@ -312,7 +332,7 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
312
332
|
Name => 'TrackTranslate',
|
313
333
|
SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
|
314
334
|
},
|
315
|
-
0x26fc => { Name => 'TrackTranslateEditionUID',
|
335
|
+
0x26fc => { Name => 'TrackTranslateEditionUID', %uidInfo, Unknown => 1 },
|
316
336
|
0x26bf => {
|
317
337
|
Name => 'TrackTranslateCodec',
|
318
338
|
Format => 'unsigned',
|
@@ -359,6 +379,8 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
359
379
|
0 => 'Pixels',
|
360
380
|
1 => 'cm',
|
361
381
|
2 => 'inches',
|
382
|
+
3 => 'Display Aspect Ratio',
|
383
|
+
4 => 'Unknown',
|
362
384
|
},
|
363
385
|
},
|
364
386
|
0x14b3 => {
|
@@ -514,7 +536,7 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
514
536
|
0x66e => { Name => 'AttachedFileName', Format => 'utf8' },
|
515
537
|
0x660 => { Name => 'AttachedFileMIMEType', Format => 'string' },
|
516
538
|
0x65c => { Name => 'AttachedFileData', Binary => 1 },
|
517
|
-
0x6ae => { Name => 'AttachedFileUID',
|
539
|
+
0x6ae => { Name => 'AttachedFileUID', %uidInfo },
|
518
540
|
0x675 => { Name => 'AttachedFileReferral', Binary => 1, Unknown => 1 },
|
519
541
|
#
|
520
542
|
# Chapters
|
@@ -527,7 +549,7 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
527
549
|
Name => 'EditionEntry',
|
528
550
|
SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
|
529
551
|
},
|
530
|
-
0x5bc => { Name => 'EditionUID',
|
552
|
+
0x5bc => { Name => 'EditionUID', %uidInfo, Unknown => 1 },
|
531
553
|
0x5bd => { Name => 'EditionFlagHidden', Format => 'unsigned', Unknown => 1 },
|
532
554
|
0x5db => { Name => 'EditionFlagDefault',Format => 'unsigned', Unknown => 1 },
|
533
555
|
0x5dd => { Name => 'EditionFlagOrdered',Format => 'unsigned', Unknown => 1 },
|
@@ -535,7 +557,7 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
535
557
|
Name => 'ChapterAtom',
|
536
558
|
SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
|
537
559
|
},
|
538
|
-
0x33c4 => { Name => 'ChapterUID',
|
560
|
+
0x33c4 => { Name => 'ChapterUID', %uidInfo, Unknown => 1 },
|
539
561
|
0x11 => {
|
540
562
|
Name => 'ChapterTimeStart',
|
541
563
|
Groups => { 1 => 'Chapter#' },
|
@@ -551,8 +573,8 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
551
573
|
},
|
552
574
|
0x18 => { Name => 'ChapterFlagHidden', Format => 'unsigned', Unknown => 1 },
|
553
575
|
0x598 => { Name => 'ChapterFlagEnabled',Format => 'unsigned', Unknown => 1 },
|
554
|
-
0x2e67=> { Name => 'ChapterSegmentUID',
|
555
|
-
0x2ebc=> { Name => 'ChapterSegmentEditionUID',
|
576
|
+
0x2e67=> { Name => 'ChapterSegmentUID', %uidInfo, Unknown => 1 },
|
577
|
+
0x2ebc=> { Name => 'ChapterSegmentEditionUID', %uidInfo, Unknown => 1 },
|
556
578
|
0x23c3 => {
|
557
579
|
Name => 'ChapterPhysicalEquivalent',
|
558
580
|
Format => 'unsigned',
|
@@ -619,21 +641,24 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
619
641
|
Name => 'Targets',
|
620
642
|
SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
|
621
643
|
},
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
644
|
+
# Targets elements
|
645
|
+
0x28ca => { Name => 'TargetTypeValue', Format => 'unsigned' },
|
646
|
+
0x23ca => { Name => 'TargetType', Format => 'string' },
|
647
|
+
0x23c5 => { Name => 'TagTrackUID', %uidInfo },
|
648
|
+
0x23c9 => { Name => 'TagEditionUID', %uidInfo },
|
649
|
+
0x23c4 => { Name => 'TagChapterUID', %uidInfo },
|
650
|
+
0x23c6 => { Name => 'TagAttachmentUID', %uidInfo },
|
628
651
|
0x27c8 => {
|
629
652
|
Name => 'SimpleTag',
|
630
653
|
SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
|
631
654
|
},
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
|
655
|
+
# SimpleTag elements
|
656
|
+
0x5a3 => { Name => 'TagName', Format => 'utf8' },
|
657
|
+
0x47a => { Name => 'TagLanguage', Format => 'string' },
|
658
|
+
0x47a => { Name => 'TagLanguageBCP47', Format => 'string' },
|
659
|
+
0x484 => { Name => 'TagDefault', Format => 'unsigned', PrintConv => \%noYes },
|
660
|
+
0x487 => { Name => 'TagString', Format => 'utf8' },
|
661
|
+
0x485 => { Name => 'TagBinary', Binary => 1 },
|
637
662
|
#
|
638
663
|
# Spherical Video V2 (untested)
|
639
664
|
#
|
@@ -682,6 +707,172 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
682
707
|
0x7675 => { Name => 'ProjectionPoseRoll', Format => 'float' },
|
683
708
|
);
|
684
709
|
|
710
|
+
# standardized tag names (ref 2)
|
711
|
+
%Image::ExifTool::Matroska::Tags = (
|
712
|
+
GROUPS => { 2 => 'Video' },
|
713
|
+
VARS => { LONG_TAGS => 1 },
|
714
|
+
NOTES => q{
|
715
|
+
Standardized Matroska tags (see
|
716
|
+
L<https://www.matroska.org/technical/tagging.html>).
|
717
|
+
},
|
718
|
+
ORIGINAL => 'Original', # struct
|
719
|
+
SAMPLE => 'Sample', # struct
|
720
|
+
COUNTRY => 'Country', # struct (should deal with this properly!)
|
721
|
+
TOTAL_PARTS => 'TotalParts',
|
722
|
+
PART_NUMBER => 'PartNumber',
|
723
|
+
PART_OFFSET => 'PartOffset',
|
724
|
+
TITLE => 'Title',
|
725
|
+
SUBTITLE => 'Subtitle',
|
726
|
+
URL => 'URL', # nested
|
727
|
+
SORT_WITH => 'SortWith', # nested
|
728
|
+
INSTRUMENTS => 'Instruments', # nested
|
729
|
+
EMAIL => 'Email', # nested
|
730
|
+
ADDRESS => 'Address', # nested
|
731
|
+
FAX => 'FAX', # nested
|
732
|
+
PHONE => 'Phone', # nested
|
733
|
+
ARTIST => 'Artist',
|
734
|
+
LEAD_PERFORMER => 'LeadPerformer',
|
735
|
+
ACCOMPANIMENT => 'Accompaniment',
|
736
|
+
COMPOSER => 'Composer',
|
737
|
+
ARRANGER => 'Arranger',
|
738
|
+
LYRICS => 'Lyrics',
|
739
|
+
LYRICIST => 'Lyricist',
|
740
|
+
CONDUCTOR => 'Conductor',
|
741
|
+
DIRECTOR => 'Director',
|
742
|
+
ASSISTANT_DIRECTOR => 'AssistantDirector',
|
743
|
+
DIRECTOR_OF_PHOTOGRAPHY => 'DirectorOfPhotography',
|
744
|
+
SOUND_ENGINEER => 'SoundEngineer',
|
745
|
+
ART_DIRECTOR => 'ArtDirector',
|
746
|
+
PRODUCTION_DESIGNER => 'ProductionDesigner',
|
747
|
+
CHOREGRAPHER => 'Choregrapher',
|
748
|
+
COSTUME_DESIGNER => 'CostumeDesigner',
|
749
|
+
ACTOR => 'Actor',
|
750
|
+
CHARACTER => 'Character',
|
751
|
+
WRITTEN_BY => 'WrittenBy',
|
752
|
+
SCREENPLAY_BY => 'ScreenplayBy',
|
753
|
+
EDITED_BY => 'EditedBy',
|
754
|
+
PRODUCER => 'Producer',
|
755
|
+
COPRODUCER => 'Coproducer',
|
756
|
+
EXECUTIVE_PRODUCER => 'ExecutiveProducer',
|
757
|
+
DISTRIBUTED_BY => 'DistributedBy',
|
758
|
+
MASTERED_BY => 'MasteredBy',
|
759
|
+
ENCODED_BY => 'EncodedBy',
|
760
|
+
MIXED_BY => 'MixedBy',
|
761
|
+
REMIXED_BY => 'RemixedBy',
|
762
|
+
PRODUCTION_STUDIO => 'ProductionStudio',
|
763
|
+
THANKS_TO => 'ThanksTo',
|
764
|
+
PUBLISHER => 'Publisher',
|
765
|
+
LABEL => 'Label',
|
766
|
+
GENRE => 'Genre',
|
767
|
+
MOOD => 'Mood',
|
768
|
+
ORIGINAL_MEDIA_TYPE => 'OriginalMediaType',
|
769
|
+
CONTENT_TYPE => 'ContentType',
|
770
|
+
SUBJECT => 'Subject',
|
771
|
+
DESCRIPTION => 'Description',
|
772
|
+
KEYWORDS => 'Keywords',
|
773
|
+
SUMMARY => 'Summary',
|
774
|
+
SYNOPSIS => 'Synopsis',
|
775
|
+
INITIAL_KEY => 'InitialKey',
|
776
|
+
PERIOD => 'Period',
|
777
|
+
LAW_RATING => 'LawRating',
|
778
|
+
DATE_RELEASED => { Name => 'DateReleased', %dateInfo },
|
779
|
+
DATE_RECORDED => { Name => 'DateTimeOriginal', %dateInfo, Description => 'Date/Time Original' },
|
780
|
+
DATE_ENCODED => { Name => 'DateEncoded', %dateInfo },
|
781
|
+
DATE_TAGGED => { Name => 'DateTagged', %dateInfo },
|
782
|
+
DATE_DIGITIZED => { Name => 'CreateDate', %dateInfo },
|
783
|
+
DATE_WRITTEN => { Name => 'DateWritten', %dateInfo },
|
784
|
+
DATE_PURCHASED => { Name => 'DatePurchased', %dateInfo },
|
785
|
+
RECORDING_LOCATION => 'RecordingLocation',
|
786
|
+
COMPOSITION_LOCATION => 'CompositionLocation',
|
787
|
+
COMPOSER_NATIONALITY => 'ComposerNationality',
|
788
|
+
COMMENT => 'Comment',
|
789
|
+
PLAY_COUNTER => 'PlayCounter',
|
790
|
+
RATING => 'Rating',
|
791
|
+
ENCODER => 'Encoder',
|
792
|
+
ENCODER_SETTINGS => 'EncoderSettings',
|
793
|
+
BPS => 'BPS',
|
794
|
+
FPS => 'FPS',
|
795
|
+
BPM => 'BPM',
|
796
|
+
MEASURE => 'Measure',
|
797
|
+
TUNING => 'Tuning',
|
798
|
+
REPLAYGAIN_GAIN => 'ReplaygainGain',
|
799
|
+
REPLAYGAIN_PEAK => 'ReplaygainPeak',
|
800
|
+
ISRC => 'ISRC',
|
801
|
+
MCDI => 'MCDI',
|
802
|
+
ISBN => 'ISBN',
|
803
|
+
BARCODE => 'Barcode',
|
804
|
+
CATALOG_NUMBER => 'CatalogNumber',
|
805
|
+
LABEL_CODE => 'LabelCode',
|
806
|
+
LCCN => 'Lccn',
|
807
|
+
IMDB => 'IMDB',
|
808
|
+
TMDB => 'TMDB',
|
809
|
+
TVDB => 'TVDB',
|
810
|
+
PURCHASE_ITEM => 'PurchaseItem',
|
811
|
+
PURCHASE_INFO => 'PurchaseInfo',
|
812
|
+
PURCHASE_OWNER => 'PurchaseOwner',
|
813
|
+
PURCHASE_PRICE => 'PurchasePrice',
|
814
|
+
PURCHASE_CURRENCY => 'PurchaseCurrency',
|
815
|
+
COPYRIGHT => 'Copyright',
|
816
|
+
PRODUCTION_COPYRIGHT => 'ProductionCopyright',
|
817
|
+
LICENSE => 'License',
|
818
|
+
TERMS_OF_USE => 'TermsOfUse',
|
819
|
+
);
|
820
|
+
|
821
|
+
#------------------------------------------------------------------------------
|
822
|
+
# Handle MKV SimpleTag structure
|
823
|
+
# Inputs: 0) ExifTool ref, 1) structure ref, 2) parent tag ID, 3) parent tag Name,
|
824
|
+
# 4) language code, 5) country code
|
825
|
+
sub HandleStruct($$;$$$$)
|
826
|
+
{
|
827
|
+
local $_;
|
828
|
+
my ($et, $struct, $pid, $pname, $lang, $ctry) = @_;
|
829
|
+
my $tagTbl = GetTagTable('Image::ExifTool::Matroska::Tags');
|
830
|
+
my $tag = $$struct{TagName};
|
831
|
+
my $tagInfo = $$tagTbl{$tag};
|
832
|
+
# create tag if necessary
|
833
|
+
unless (ref $tagInfo eq 'HASH') {
|
834
|
+
my $name = ucfirst lc $tag;
|
835
|
+
$name =~ tr/0-9a-zA-Z_//dc;
|
836
|
+
$name =~ s/_([a-z])/\U$1/g;
|
837
|
+
$name = "Tag_$name" if length $name < 2;
|
838
|
+
$tagInfo = AddTagToTable($tagTbl, $tag, { Name => $name });
|
839
|
+
}
|
840
|
+
my ($id, $nm);
|
841
|
+
if ($pid) {
|
842
|
+
$id = "$pid/$tag";
|
843
|
+
$nm = "$pname/$$tagInfo{Name}";
|
844
|
+
unless ($$tagTbl{$id}) {
|
845
|
+
my %copy = %$tagInfo;
|
846
|
+
$copy{Name} = $nm;
|
847
|
+
$tagInfo = AddTagToTable($tagTbl, $id, \%copy);
|
848
|
+
}
|
849
|
+
} else {
|
850
|
+
($id, $nm) = ($tag, $$tagInfo{Name});
|
851
|
+
}
|
852
|
+
if (defined $$struct{TagString} or defined $$struct{TagBinary}) {
|
853
|
+
my $val = defined $$struct{TagString} ? $$struct{TagString} : \$$struct{TagBinary};
|
854
|
+
$lang = $$struct{TagLanguageBCP47} || $$struct{TagLanguage} || $lang;
|
855
|
+
# (Note: not currently handling TagDefault attribute)
|
856
|
+
my $code = $lang;
|
857
|
+
$code = $lang ? "${lang}-${ctry}" : "eng-${ctry}" if $ctry; # ('eng' is default lang)
|
858
|
+
if ($code) {
|
859
|
+
$tagInfo = Image::ExifTool::GetLangInfo($tagInfo, $code);
|
860
|
+
$et->HandleTag($tagTbl, $$tagInfo{TagID}, $val);
|
861
|
+
} else {
|
862
|
+
$et->HandleTag($tagTbl, $id, $val);
|
863
|
+
}
|
864
|
+
# COUNTRY is handled as an attribute for contained tags
|
865
|
+
if ($tag eq 'COUNTRY') {
|
866
|
+
$ctry = $val;
|
867
|
+
($id, $nm) = ($pid, $pname);
|
868
|
+
}
|
869
|
+
}
|
870
|
+
if ($$struct{struct}) {
|
871
|
+
# step into each contained structure
|
872
|
+
HandleStruct($et, $_, $id, $nm, $lang, $ctry) foreach @{$$struct{struct}};
|
873
|
+
}
|
874
|
+
}
|
875
|
+
|
685
876
|
#------------------------------------------------------------------------------
|
686
877
|
# Get variable-length Matroska integer
|
687
878
|
# Inputs: 0) data buffer, 1) position in data
|
@@ -723,7 +914,7 @@ sub ProcessMKV($$)
|
|
723
914
|
{
|
724
915
|
my ($et, $dirInfo) = @_;
|
725
916
|
my $raf = $$dirInfo{RAF};
|
726
|
-
my ($buff, $buf2, @dirEnd, $trackIndent, %trackTypes);
|
917
|
+
my ($buff, $buf2, @dirEnd, $trackIndent, %trackTypes, $struct);
|
727
918
|
|
728
919
|
$raf->Read($buff, 4) == 4 or return 0;
|
729
920
|
return 0 unless $buff =~ /^\x1a\x45\xdf\xa3/;
|
@@ -743,18 +934,38 @@ sub ProcessMKV($$)
|
|
743
934
|
|
744
935
|
# set flag to process entire file (otherwise we stop at the first Cluster)
|
745
936
|
my $verbose = $et->Options('Verbose');
|
746
|
-
my $processAll = ($verbose or $et->Options('Unknown') > 1);
|
937
|
+
my $processAll = ($verbose or $et->Options('Unknown') > 1) ? 2 : 0;
|
938
|
+
++$processAll if $et->Options('ExtractEmbedded');
|
747
939
|
$$et{TrackTypes} = \%trackTypes; # store Track types reference
|
748
940
|
my $oldIndent = $$et{INDENT};
|
749
941
|
my $chapterNum = 0;
|
942
|
+
my $dirName = 'MKV';
|
750
943
|
|
751
944
|
# loop over all Matroska elements
|
752
945
|
for (;;) {
|
753
|
-
while (@dirEnd
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
946
|
+
while (@dirEnd) {
|
947
|
+
if ($pos + $dataPos >= $dirEnd[-1][0]) {
|
948
|
+
pop @dirEnd;
|
949
|
+
if ($struct) {
|
950
|
+
if (@dirEnd and $dirEnd[-1][2]) {
|
951
|
+
# save this nested structure
|
952
|
+
$dirEnd[-1][2]{struct} or $dirEnd[-1][2]{struct} = [ ];
|
953
|
+
push @{$dirEnd[-1][2]{struct}}, $struct;
|
954
|
+
$struct = $dirEnd[-1][2];
|
955
|
+
} else {
|
956
|
+
# handle completed structures now
|
957
|
+
HandleStruct($et, $struct);
|
958
|
+
undef $struct;
|
959
|
+
}
|
960
|
+
}
|
961
|
+
$dirName = @dirEnd ? $dirEnd[-1][1] : 'MKV';
|
962
|
+
# use INDENT to decide whether or not we are done this Track element
|
963
|
+
delete $$et{SET_GROUP1} if $trackIndent and $trackIndent eq $$et{INDENT};
|
964
|
+
$$et{INDENT} = substr($$et{INDENT}, 0, -2);
|
965
|
+
} else {
|
966
|
+
$dirName = $dirEnd[-1][1];
|
967
|
+
last;
|
968
|
+
}
|
758
969
|
}
|
759
970
|
# read more if we are getting close to the end of our buffer
|
760
971
|
# (24 more bytes should be enough to read this element header)
|
@@ -785,17 +996,27 @@ sub ProcessMKV($$)
|
|
785
996
|
}
|
786
997
|
my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
|
787
998
|
# just fall through into the contained EBML elements
|
788
|
-
if ($tagInfo
|
789
|
-
|
790
|
-
|
791
|
-
|
792
|
-
|
793
|
-
|
794
|
-
|
795
|
-
|
796
|
-
|
999
|
+
if ($tagInfo) {
|
1000
|
+
if ($$tagInfo{SubDirectory}) {
|
1001
|
+
# stop processing at first cluster unless we are using -v -U or -ee
|
1002
|
+
if ($$tagInfo{Name} eq 'Cluster' and $processAll < 2) {
|
1003
|
+
last unless $processAll;
|
1004
|
+
undef $tagInfo; # just skip the Cluster when -ee is used
|
1005
|
+
} else {
|
1006
|
+
$$et{INDENT} .= '| ';
|
1007
|
+
$et->VerboseDir($$tagTablePtr{$tag}{Name}, undef, $size);
|
1008
|
+
$dirName = $$tagInfo{Name};
|
1009
|
+
push @dirEnd, [ $pos + $dataPos + $size, $dirName, $struct ];
|
1010
|
+
$struct = { } if $dirName eq 'SimpleTag'; # keep track of SimpleTag elements
|
1011
|
+
if ($$tagInfo{Name} eq 'ChapterAtom') {
|
1012
|
+
$$et{SET_GROUP1} = 'Chapter' . (++$chapterNum);
|
1013
|
+
$trackIndent = $$et{INDENT};
|
1014
|
+
}
|
1015
|
+
next;
|
1016
|
+
}
|
797
1017
|
}
|
798
|
-
|
1018
|
+
} elsif ($verbose) {
|
1019
|
+
$et->VPrint(0,sprintf("$$et{INDENT}- Tag 0x%x (Unknown, %d bytes)\n", $tag, $size));
|
799
1020
|
}
|
800
1021
|
last if $unknownSize;
|
801
1022
|
if ($pos + $size > $dataLen) {
|
@@ -879,8 +1100,9 @@ sub ProcessMKV($$)
|
|
879
1100
|
Start => $pos,
|
880
1101
|
Size => $size,
|
881
1102
|
);
|
882
|
-
if ($$tagInfo{NoSave}) {
|
1103
|
+
if ($$tagInfo{NoSave} or $struct) {
|
883
1104
|
$et->VerboseInfo($tag, $tagInfo, Value => $val, %parms) if $verbose;
|
1105
|
+
$$struct{$$tagInfo{Name}} = $val if $struct;
|
884
1106
|
} else {
|
885
1107
|
$et->HandleTag($tagTablePtr, $tag, $val, %parms);
|
886
1108
|
}
|
@@ -929,6 +1151,8 @@ under the same terms as Perl itself.
|
|
929
1151
|
|
930
1152
|
=item L<http://www.matroska.org/technical/specs/index.html>
|
931
1153
|
|
1154
|
+
=item L<https://www.matroska.org/technical/tagging.html>
|
1155
|
+
|
932
1156
|
=back
|
933
1157
|
|
934
1158
|
=head1 SEE ALSO
|
@@ -14,7 +14,7 @@ use strict;
|
|
14
14
|
use vars qw($VERSION);
|
15
15
|
use Image::ExifTool::Exif;
|
16
16
|
|
17
|
-
$VERSION = '1.
|
17
|
+
$VERSION = '1.02';
|
18
18
|
|
19
19
|
# Motorola makernotes tags (ref PH)
|
20
20
|
%Image::ExifTool::Motorola::Main = (
|
@@ -54,7 +54,12 @@ $VERSION = '1.01';
|
|
54
54
|
# 0x6400 - string: 'AUTO','ON','OFF'
|
55
55
|
# 0x6401 - string: 'HDR'
|
56
56
|
# 0x6410 - string: 'NO','YES'
|
57
|
-
# 0x6420 - int32s: 0 (only exists in HDR images?)
|
57
|
+
# 0x6420 - int32s for some models: 0 (only exists in HDR images?)
|
58
|
+
0x6420 => { #forum13731
|
59
|
+
Condition => '$format eq "string"',
|
60
|
+
Name => 'CustomRendered',
|
61
|
+
Writable => 'string',
|
62
|
+
},
|
58
63
|
# 0x6430 - float
|
59
64
|
# 0x6431 - int8u: 0,1
|
60
65
|
# 0x6432 - int8u: 0,79,100
|
@@ -89,6 +94,7 @@ $VERSION = '1.01';
|
|
89
94
|
# 0x64c2,0x64c3 - int32s
|
90
95
|
# 0x64c4 - int32s
|
91
96
|
# 0x64c5 - int32u
|
97
|
+
0x64d0 => { Name => 'DriveMode', Writable => 'string' }, #forum13731
|
92
98
|
# 0x6500 - int8u: 1
|
93
99
|
# 0x6501 - string: 'Luma-Chroma Plane','Chroma only' or int8u: 0
|
94
100
|
# 0x6502 - string: 'Luma-Chroma Plane','Chroma only','' or int8u: 1,255
|