File Coverage

blib/lib/Image/ExifTool/XMP2.pl
Criterion Covered Total %
statement 16 23 69.5
branch 1 4 25.0
condition 0 3 0.0
subroutine 4 6 66.6
pod 0 3 0.0
total 21 39 53.8


line stmt bran cond sub pod time code
1             #------------------------------------------------------------------------------
2             # File: XMP2.pl
3             #
4             # Description: Additional XMP namespace definitions
5             #
6             # Revisions: 10/12/2008 - P. Harvey Created
7             #
8             # References: 1) PLUS - http://ns.useplus.org/
9             # 2) PRISM - http://www.prismstandard.org/
10             # 3) http://www.portfoliofaq.com/pfaq/v7mappings.htm
11             # 4) http://www.iptc.org/IPTC4XMP/
12             # 5) http://creativecommons.org/technology/xmp
13             # --> changed to http://wiki.creativecommons.org/Companion_File_metadata_specification (2007/12/21)
14             # 6) http://www.optimasc.com/products/fileid/xmp-extensions.pdf
15             # 9) http://www.w3.org/TR/SVG11/
16             # 11) http://www.extensis.com/en/support/kb_article.jsp?articleNumber=6102211
17             # 12) XMPSpecificationPart3_May2013, page 58
18             # 13) https://developer.android.com/training/camera2/Dynamic-depth-v1.0.pdf
19             # 14) http://www.iptc.org/standards/photo-metadata/iptc-standard/
20             #------------------------------------------------------------------------------
21              
22             package Image::ExifTool::XMP;
23              
24 28     28   218 use strict;
  28         72  
  28         1643  
25 28     28   170 use Image::ExifTool qw(:Utils);
  28         65  
  28         5208  
26 28     28   198 use Image::ExifTool::XMP;
  28         69  
  28         186313  
27              
28             sub ProcessSEAL($$;$);
29             sub Init_crd($);
30              
31             #------------------------------------------------------------------------------
32              
33             # xmpDM structure definitions
34             my %sCuePointParam = (
35             STRUCT_NAME => 'CuePointParam',
36             NAMESPACE => 'xmpDM',
37             key => { },
38             value => { },
39             );
40             my %sMarker = (
41             STRUCT_NAME => 'Marker',
42             NAMESPACE => 'xmpDM',
43             comment => { },
44             duration => { },
45             location => { },
46             name => { },
47             startTime => { },
48             target => { },
49             type => { },
50             # added Oct 2008
51             cuePointParams => { Struct => \%sCuePointParam, List => 'Seq' },
52             cuePointType=> { },
53             probability => { Writable => 'real' },
54             speaker => { },
55             );
56             my %sTime = (
57             STRUCT_NAME => 'Time',
58             NAMESPACE => 'xmpDM',
59             scale => { Writable => 'rational' },
60             value => { Writable => 'integer' },
61             );
62             my %sTimecode = (
63             STRUCT_NAME => 'Timecode',
64             NAMESPACE => 'xmpDM',
65             timeFormat => {
66             PrintConv => {
67             '24Timecode' => '24 fps',
68             '25Timecode' => '25 fps',
69             '2997DropTimecode' => '29.97 fps (drop)',
70             '2997NonDropTimecode' => '29.97 fps (non-drop)',
71             '30Timecode' => '30 fps',
72             '50Timecode' => '50 fps',
73             '5994DropTimecode' => '59.94 fps (drop)',
74             '5994NonDropTimecode' => '59.94 fps (non-drop)',
75             '60Timecode' => '60 fps',
76             '23976Timecode' => '23.976 fps',
77             },
78             },
79             timeValue => { },
80             value => { Writable => 'integer', Notes => 'only in XMP 2008 spec; an error?' },
81             );
82              
83             # camera-raw defaults
84             %Image::ExifTool::XMP::crd = (
85             %xmpTableDefaults,
86             INIT_TABLE => \&Init_crd,
87             GROUPS => { 1 => 'XMP-crd', 2 => 'Image' },
88             NAMESPACE => 'crd',
89             AVOID => 1,
90             TABLE_DESC => 'Photoshop Camera Defaults namespace',
91             NOTES => 'Adobe Camera Raw Defaults tags.',
92             # (tags added dynamically when WRITE_PROC is called)
93             );
94              
95             # XMP Dynamic Media namespace properties (xmpDM)
96             %Image::ExifTool::XMP::xmpDM = (
97             %xmpTableDefaults,
98             GROUPS => { 1 => 'XMP-xmpDM', 2 => 'Image' },
99             NAMESPACE => 'xmpDM',
100             NOTES => q{
101             XMP Dynamic Media namespace tags. See
102             L for the
103             specification.
104             },
105             absPeakAudioFilePath=> { },
106             album => { },
107             altTapeName => { },
108             altTimecode => { Struct => \%sTimecode },
109             artist => { Avoid => 1, Groups => { 2 => 'Author' } },
110             audioModDate => { Groups => { 2 => 'Time' }, %dateTimeInfo },
111             audioSampleRate => { Writable => 'integer' },
112             audioSampleType => {
113             PrintConv => {
114             '8Int' => '8-bit integer',
115             '16Int' => '16-bit integer',
116             '24Int' => '24-bit integer',
117             '32Int' => '32-bit integer',
118             '32Float' => '32-bit float',
119             'Compressed' => 'Compressed',
120             'Packed' => 'Packed',
121             'Other' => 'Other',
122             },
123             },
124             audioChannelType => {
125             PrintConv => {
126             'Mono' => 'Mono',
127             'Stereo' => 'Stereo',
128             '5.1' => '5.1',
129             '7.1' => '7.1',
130             '16 Channel' => '16 Channel',
131             'Other' => 'Other',
132             },
133             },
134             audioCompressor => { },
135             beatSpliceParams => {
136             Struct => {
137             STRUCT_NAME => 'BeatSpliceStretch',
138             NAMESPACE => 'xmpDM',
139             riseInDecibel => { Writable => 'real' },
140             riseInTimeDuration => { Struct => \%sTime },
141             useFileBeatsMarker => { Writable => 'boolean' },
142             },
143             },
144             cameraAngle => { },
145             cameraLabel => { },
146             cameraModel => { },
147             cameraMove => { },
148             client => { },
149             comment => { Name => 'DMComment' },
150             composer => { Groups => { 2 => 'Author' } },
151             contributedMedia => {
152             Struct => {
153             STRUCT_NAME => 'Media',
154             NAMESPACE => 'xmpDM',
155             duration => { Struct => \%sTime },
156             managed => { Writable => 'boolean' },
157             path => { },
158             startTime => { Struct => \%sTime },
159             track => { },
160             webStatement=> { },
161             },
162             List => 'Bag',
163             },
164             copyright => { Avoid => 1, Groups => { 2 => 'Author' } }, # (deprecated)
165             director => { },
166             directorPhotography => { },
167             discNumber => { }, #12
168             duration => { Struct => \%sTime },
169             engineer => { },
170             fileDataRate => { Writable => 'rational' },
171             genre => { },
172             good => { Writable => 'boolean' },
173             pick => { Writable => 'integer' }, #forum15815
174             instrument => { },
175             introTime => { Struct => \%sTime },
176             key => {
177             PrintConvColumns => 3,
178             PrintConv => {
179             'C' => 'C', 'C#' => 'C#', 'D' => 'D', 'D#' => 'D#',
180             'E' => 'E', 'F' => 'F', 'F#' => 'F#', 'G' => 'G',
181             'G#' => 'G#', 'A' => 'A', 'A#' => 'A#', 'B' => 'B',
182             },
183             },
184             logComment => { },
185             loop => { Writable => 'boolean' },
186             lyrics => { }, #12
187             numberOfBeats => { Writable => 'real' },
188             markers => { Struct => \%sMarker, List => 'Seq' },
189             metadataModDate => { Groups => { 2 => 'Time' }, %dateTimeInfo },
190             outCue => { Struct => \%sTime },
191             partOfCompilation=>{ Writable => 'boolean' }, #12
192             projectName => { },
193             projectRef => {
194             Struct => {
195             STRUCT_NAME => 'ProjectLink',
196             NAMESPACE => 'xmpDM',
197             path => { },
198             type => {
199             PrintConv => {
200             movie => 'Movie',
201             still => 'Still Image',
202             audio => 'Audio',
203             custom => 'Custom',
204             },
205             },
206             },
207             },
208             pullDown => {
209             PrintConvColumns => 2,
210             PrintConv => {
211             'WSSWW' => 'WSSWW', 'SSWWW' => 'SSWWW',
212             'SWWWS' => 'SWWWS', 'WWWSS' => 'WWWSS',
213             'WWSSW' => 'WWSSW', 'WWWSW' => 'WWWSW',
214             'WWSWW' => 'WWSWW', 'WSWWW' => 'WSWWW',
215             'SWWWW' => 'SWWWW', 'WWWWS' => 'WWWWS',
216             },
217             },
218             relativePeakAudioFilePath => { },
219             relativeTimestamp => { Struct => \%sTime },
220             releaseDate => { Groups => { 2 => 'Time' }, %dateTimeInfo },
221             resampleParams => {
222             Struct => {
223             STRUCT_NAME => 'ResampleStretch',
224             NAMESPACE => 'xmpDM',
225             quality => { PrintConv => { Low => 'Low', Medium => 'Medium', High => 'High' } },
226             },
227             },
228             scaleType => {
229             PrintConv => {
230             Major => 'Major',
231             Minor => 'Minor',
232             Both => 'Both',
233             Neither => 'Neither',
234             },
235             },
236             scene => { Avoid => 1 },
237             shotDate => { Groups => { 2 => 'Time' }, %dateTimeInfo },
238             shotDay => { },
239             shotLocation => { },
240             shotName => { },
241             shotNumber => { },
242             shotSize => { },
243             speakerPlacement=> { },
244             startTimecode => { Struct => \%sTimecode },
245             startTimeSampleSize => { Writable => 'integer' }, #PH
246             startTimeScale => { }, #PH (real?)
247             stretchMode => {
248             PrintConv => {
249             'Fixed length' => 'Fixed length',
250             'Time-Scale' => 'Time-Scale',
251             'Resample' => 'Resample',
252             'Beat Splice' => 'Beat Splice',
253             'Hybrid' => 'Hybrid',
254             },
255             },
256             takeNumber => { Writable => 'integer' },
257             tapeName => { },
258             tempo => { Writable => 'real' },
259             timeScaleParams => {
260             Struct => {
261             STRUCT_NAME => 'TimeScaleStretch',
262             NAMESPACE => 'xmpDM',
263             frameOverlappingPercentage => { Writable => 'real' },
264             frameSize => { Writable => 'real' },
265             quality => { PrintConv => { Low => 'Low', Medium => 'Medium', High => 'High' } },
266             },
267             },
268             timeSignature => {
269             PrintConvColumns => 3,
270             PrintConv => {
271             '2/4' => '2/4', '3/4' => '3/4', '4/4' => '4/4',
272             '5/4' => '5/4', '7/4' => '7/4', '6/8' => '6/8',
273             '9/8' => '9/8', '12/8'=> '12/8', 'other' => 'other',
274             },
275             },
276             trackNumber => { Writable => 'integer' },
277             Tracks => {
278             Struct => {
279             STRUCT_NAME => 'Track',
280             NAMESPACE => 'xmpDM',
281             frameRate => { },
282             markers => { Struct => \%sMarker, List => 'Seq' },
283             trackName => { },
284             trackType => { },
285             },
286             List => 'Bag',
287             },
288             videoAlphaMode => {
289             PrintConv => {
290             'straight' => 'Straight',
291             'pre-multiplied', => 'Pre-multiplied',
292             'none' => 'None',
293             },
294             },
295             videoAlphaPremultipleColor => { Struct => \%sColorant },
296             videoAlphaUnityIsTransparent => { Writable => 'boolean' },
297             videoColorSpace => {
298             PrintConv => {
299             'sRGB' => 'sRGB',
300             'CCIR-601' => 'CCIR-601',
301             'CCIR-709' => 'CCIR-709',
302             },
303             },
304             videoCompressor => { },
305             videoFieldOrder => {
306             PrintConv => {
307             Upper => 'Upper',
308             Lower => 'Lower',
309             Progressive => 'Progressive',
310             },
311             },
312             videoFrameRate => { Writable => 'real' },
313             videoFrameSize => { Struct => \%sDimensions },
314             videoModDate => { Groups => { 2 => 'Time' }, %dateTimeInfo },
315             videoPixelAspectRatio => { Writable => 'rational' },
316             videoPixelDepth => {
317             PrintConv => {
318             '8Int' => '8-bit integer',
319             '16Int' => '16-bit integer',
320             '24Int' => '24-bit integer',
321             '32Int' => '32-bit integer',
322             '32Float' => '32-bit float',
323             'Other' => 'Other',
324             },
325             },
326             );
327              
328             #------------------------------------------------------------------------------
329             # IPTC Extensions version 1.3 (+ proposed video extensions)
330              
331             # IPTC Extension 1.0 structures
332             my %sLocationDetails = (
333             STRUCT_NAME => 'LocationDetails',
334             NAMESPACE => 'Iptc4xmpExt',
335             GROUPS => { 2 => 'Location' },
336             NOTES => 'Note that the GPS elements of this structure are in the "exif" namespace.',
337             Identifier => { List => 'Bag', Namespace => 'xmp' },
338             City => { },
339             CountryCode => { },
340             CountryName => { },
341             ProvinceState => { },
342             Sublocation => { },
343             WorldRegion => { },
344             LocationId => { List => 'Bag' },
345             LocationName => { Writable => 'lang-alt' },
346             GPSLatitude => { Namespace => 'exif', %latConv },
347             GPSLongitude => { Namespace => 'exif', %longConv },
348             GPSAltitude => {
349             Namespace => 'exif',
350             Writable => 'rational',
351             PrintConv => '$val =~ /^(inf|undef)$/ ? $val : "$val m"',
352             PrintConvInv => '$val=~s/\s*m$//;$val',
353             },
354             GPSAltitudeRef => {
355             Namespace => 'exif',
356             Writable => 'integer',
357             PrintConv => {
358             OTHER => sub {
359             my ($val, $inv) = @_;
360             return undef unless $inv and $val =~ /^([-+0-9])/;
361             return($1 eq '-' ? 1 : 0);
362             },
363             0 => 'Above Sea Level',
364             1 => 'Below Sea Level',
365             },
366             },
367             );
368             my %sCVTermDetails = (
369             STRUCT_NAME => 'CVTermDetails',
370             NAMESPACE => 'Iptc4xmpExt',
371             CvTermId => { },
372             CvTermName => { Writable => 'lang-alt' },
373             CvId => { },
374             CvTermRefinedAbout => { },
375             );
376              
377             # IPTC video extensions
378             my %sPublicationEvent = (
379             STRUCT_NAME => 'PublicationEvent',
380             NAMESPACE => 'Iptc4xmpExt',
381             Date => { Groups => { 2 => 'Time' }, %dateTimeInfo },
382             Name => { },
383             Identifier => { },
384             );
385             my %sEntity = (
386             STRUCT_NAME => 'Entity',
387             NAMESPACE => 'Iptc4xmpExt',
388             Identifier => { List => 'Bag', Namespace => 'xmp' },
389             Name => { Writable => 'lang-alt' },
390             );
391             my %sEntityWithRole = (
392             STRUCT_NAME => 'EntityWithRole',
393             NAMESPACE => 'Iptc4xmpExt',
394             Identifier => { List => 'Bag', Namespace => 'xmp' },
395             Name => { Writable => 'lang-alt' },
396             Role => { List => 'Bag' },
397             );
398             # (no longer used)
399             #my %sFrameSize = (
400             # STRUCT_NAME => 'FrameSize',
401             # NAMESPACE => 'Iptc4xmpExt',
402             # WidthPixels => { Writable => 'integer' },
403             # HeightPixels => { Writable => 'integer' },
404             #);
405             my %sRating = (
406             STRUCT_NAME => 'Rating',
407             NAMESPACE => 'Iptc4xmpExt',
408             RatingValue => { FlatName => 'Value' },
409             RatingSourceLink => { FlatName => 'SourceLink' },
410             RatingScaleMinValue => { FlatName => 'ScaleMinValue' },
411             RatingScaleMaxValue => { FlatName => 'ScaleMaxValue' },
412             RatingValueLogoLink => { FlatName => 'ValueLogoLink' },
413             RatingRegion => {
414             FlatName => 'Region',
415             Struct => \%sLocationDetails,
416             List => 'Bag',
417             },
418             );
419             my %sEpisode = (
420             STRUCT_NAME => 'EpisodeOrSeason',
421             NAMESPACE => 'Iptc4xmpExt',
422             Name => { },
423             Number => { },
424             Identifier => { },
425             );
426             my %sSeries = (
427             STRUCT_NAME => 'Series',
428             NAMESPACE => 'Iptc4xmpExt',
429             Name => { },
430             Identifier => { },
431             );
432             my %sTemporalCoverage = (
433             STRUCT_NAME => 'TemporalCoverage',
434             NAMESPACE => 'Iptc4xmpExt',
435             tempCoverageFrom => { FlatName => 'From', %dateTimeInfo, Groups => { 2 => 'Time' } },
436             tempCoverageTo => { FlatName => 'To', %dateTimeInfo, Groups => { 2 => 'Time' } },
437             );
438             my %sQualifiedLink = (
439             STRUCT_NAME => 'QualifiedLink',
440             NAMESPACE => 'Iptc4xmpExt',
441             Link => { },
442             LinkQualifier => { },
443             );
444             my %sTextRegion = (
445             STRUCT_NAME => 'TextRegion',
446             NAMESPACE => 'Iptc4xmpExt',
447             RegionText => { },
448             Region => { Struct => \%Image::ExifTool::XMP::sArea },
449             );
450             my %sLinkedImage = (
451             STRUCT_NAME => 'LinkedImage',
452             NAMESPACE => 'Iptc4xmpExt',
453             Link => { },
454             LinkQualifier => { List => 'Bag' },
455             ImageRole => { },
456             'format' => { Namespace => 'dc' },
457             WidthPixels => { Writable => 'integer' },
458             HeightPixels=> { Writable => 'integer' },
459             UsedVideoFrame => { Struct => \%sTimecode },
460             );
461             my %sBoundaryPoint = ( # new in 1.5
462             STRUCT_NAME => 'BoundaryPoint',
463             NAMESPACE => 'Iptc4xmpExt',
464             rbX => { FlatName => 'X', Writable => 'real' },
465             rbY => { FlatName => 'Y', Writable => 'real' },
466             );
467             my %sRegionBoundary = ( # new in 1.5
468             STRUCT_NAME => 'RegionBoundary',
469             NAMESPACE => 'Iptc4xmpExt',
470             rbShape => { FlatName => 'Shape', PrintConv => { rectangle => 'Rectangle', circle => 'Circle', polygon => 'Polygon' } },
471             rbUnit => { FlatName => 'Unit', PrintConv => { pixel => 'Pixel', relative => 'Relative' } },
472             rbX => { FlatName => 'X', Writable => 'real' },
473             rbY => { FlatName => 'Y', Writable => 'real' },
474             rbW => { FlatName => 'W', Writable => 'real' },
475             rbH => { FlatName => 'H', Writable => 'real' },
476             rbRx => { FlatName => 'Rx', Writable => 'real' },
477             rbVertices => { FlatName => 'Vertices', List => 'Seq', Struct => \%sBoundaryPoint },
478             );
479             my %sImageRegion = ( # new in 1.5
480             STRUCT_NAME => 'ImageRegion',
481             NAMESPACE => undef, # undefined to allow variable-namespace extensions
482             NOTES => q{
483             This structure is new in the IPTC Extension version 1.5 specification. As
484             well as the fields defined below, this structure may contain any top-level
485             XMP tags, but since they aren't pre-defined the only way to add these tags
486             is to write ImageRegion as a structure with these tags as new fields.
487             },
488             RegionBoundary => { Namespace => 'Iptc4xmpExt', FlatName => 'Boundary', Struct => \%sRegionBoundary },
489             rId => { Namespace => 'Iptc4xmpExt', FlatName => 'ID' },
490             Name => { Namespace => 'Iptc4xmpExt', Writable => 'lang-alt' },
491             rCtype => { Namespace => 'Iptc4xmpExt', FlatName => 'Ctype', List => 'Bag', Struct => \%sEntity },
492             rRole => { Namespace => 'Iptc4xmpExt', FlatName => 'Role', List => 'Bag', Struct => \%sEntity },
493             );
494              
495             # IPTC Extension namespace properties (Iptc4xmpExt) (ref 4, 14)
496             %Image::ExifTool::XMP::iptcExt = (
497             %xmpTableDefaults,
498             GROUPS => { 1 => 'XMP-iptcExt', 2 => 'Author' },
499             NAMESPACE => 'Iptc4xmpExt',
500             TABLE_DESC => 'XMP IPTC Extension',
501             NOTES => q{
502             This table contains tags defined by the IPTC Extension schema version 1.7
503             and IPTC Video Metadata version 1.3, plus the AI additions. The actual
504             namespace prefix is "Iptc4xmpExt", but ExifTool shortens this for the family
505             1 group name. (See
506             L and
507             L.)
508             },
509             AboutCvTerm => {
510             Struct => \%sCVTermDetails,
511             List => 'Bag',
512             },
513             AboutCvTermCvId => { Flat => 1, Name => 'AboutCvTermCvId' },
514             AboutCvTermCvTermId => { Flat => 1, Name => 'AboutCvTermId' },
515             AboutCvTermCvTermName => { Flat => 1, Name => 'AboutCvTermName' },
516             AboutCvTermCvTermRefinedAbout => { Flat => 1, Name => 'AboutCvTermRefinedAbout' },
517             AddlModelInfo => { Name => 'AdditionalModelInformation' },
518             ArtworkOrObject => {
519             Struct => {
520             STRUCT_NAME => 'ArtworkOrObjectDetails',
521             NAMESPACE => 'Iptc4xmpExt',
522             AOCopyrightNotice => { },
523             AOCreator => { List => 'Seq' },
524             AODateCreated=> { Groups => { 2 => 'Time' }, %dateTimeInfo },
525             AOSource => { },
526             AOSourceInvNo=> { },
527             AOTitle => { Writable => 'lang-alt' },
528             AOCurrentCopyrightOwnerName => { },
529             AOCurrentCopyrightOwnerId => { },
530             AOCurrentLicensorName => { },
531             AOCurrentLicensorId => { },
532             AOCreatorId => { List => 'Seq' },
533             AOCircaDateCreated => { Groups => { 2 => 'Time' }, Protected => 1 },
534             AOStylePeriod => { List => 'Bag' },
535             AOSourceInvURL => { },
536             AOContentDescription => { Writable => 'lang-alt' },
537             AOContributionDescription => { Writable => 'lang-alt' },
538             AOPhysicalDescription => { Writable => 'lang-alt' },
539             },
540             List => 'Bag',
541             },
542             ArtworkOrObjectAOCopyrightNotice => { Flat => 1, Name => 'ArtworkCopyrightNotice' },
543             ArtworkOrObjectAOCreator => { Flat => 1, Name => 'ArtworkCreator' },
544             ArtworkOrObjectAODateCreated => { Flat => 1, Name => 'ArtworkDateCreated' },
545             ArtworkOrObjectAOSource => { Flat => 1, Name => 'ArtworkSource' },
546             ArtworkOrObjectAOSourceInvNo => { Flat => 1, Name => 'ArtworkSourceInventoryNo' },
547             ArtworkOrObjectAOTitle => { Flat => 1, Name => 'ArtworkTitle' },
548             ArtworkOrObjectAOCurrentCopyrightOwnerName => { Flat => 1, Name => 'ArtworkCopyrightOwnerName' },
549             ArtworkOrObjectAOCurrentCopyrightOwnerId => { Flat => 1, Name => 'ArtworkCopyrightOwnerID' },
550             ArtworkOrObjectAOCurrentLicensorName => { Flat => 1, Name => 'ArtworkLicensorName' },
551             ArtworkOrObjectAOCurrentLicensorId => { Flat => 1, Name => 'ArtworkLicensorID' },
552             ArtworkOrObjectAOCreatorId => { Flat => 1, Name => 'ArtworkCreatorID' },
553             ArtworkOrObjectAOCircaDateCreated => { Flat => 1, Name => 'ArtworkCircaDateCreated' },
554             ArtworkOrObjectAOStylePeriod => { Flat => 1, Name => 'ArtworkStylePeriod' },
555             ArtworkOrObjectAOSourceInvURL => { Flat => 1, Name => 'ArtworkSourceInvURL' },
556             ArtworkOrObjectAOContentDescription => { Flat => 1, Name => 'ArtworkContentDescription' },
557             ArtworkOrObjectAOContributionDescription => { Flat => 1, Name => 'ArtworkContributionDescription' },
558             ArtworkOrObjectAOPhysicalDescription => { Flat => 1, Name => 'ArtworkPhysicalDescription' },
559             CVterm => {
560             Name => 'ControlledVocabularyTerm',
561             List => 'Bag',
562             Notes => 'deprecated by version 1.2',
563             },
564             DigImageGUID => { Groups => { 2 => 'Image' }, Name => 'DigitalImageGUID' },
565             DigitalSourcefileType => {
566             Name => 'DigitalSourceFileType',
567             Notes => 'now deprecated -- replaced by DigitalSourceType',
568             Groups => { 2 => 'Image' },
569             },
570             DigitalSourceType => { Name => 'DigitalSourceType', Groups => { 2 => 'Image' } },
571             EmbdEncRightsExpr => {
572             Struct => {
573             STRUCT_NAME => 'EEREDetails',
574             NAMESPACE => 'Iptc4xmpExt',
575             EncRightsExpr => { },
576             RightsExprEncType => { },
577             RightsExprLangId => { },
578             },
579             List => 'Bag',
580             },
581             EmbdEncRightsExprEncRightsExpr => { Flat => 1, Name => 'EmbeddedEncodedRightsExpr' },
582             EmbdEncRightsExprRightsExprEncType => { Flat => 1, Name => 'EmbeddedEncodedRightsExprType' },
583             EmbdEncRightsExprRightsExprLangId => { Flat => 1, Name => 'EmbeddedEncodedRightsExprLangID' },
584             Event => { Writable => 'lang-alt' },
585             IptcLastEdited => {
586             Name => 'IPTCLastEdited',
587             Groups => { 2 => 'Time' },
588             %dateTimeInfo,
589             },
590             LinkedEncRightsExpr => {
591             Struct => {
592             STRUCT_NAME => 'LEREDetails',
593             NAMESPACE => 'Iptc4xmpExt',
594             LinkedRightsExpr => { },
595             RightsExprEncType => { },
596             RightsExprLangId => { },
597             },
598             List => 'Bag',
599             },
600             LinkedEncRightsExprLinkedRightsExpr => { Flat => 1, Name => 'LinkedEncodedRightsExpr' },
601             LinkedEncRightsExprRightsExprEncType => { Flat => 1, Name => 'LinkedEncodedRightsExprType' },
602             LinkedEncRightsExprRightsExprLangId => { Flat => 1, Name => 'LinkedEncodedRightsExprLangID' },
603             LocationCreated => {
604             Struct => \%sLocationDetails,
605             Groups => { 2 => 'Location' },
606             List => 'Bag',
607             },
608             LocationShown => {
609             Struct => \%sLocationDetails,
610             Groups => { 2 => 'Location' },
611             List => 'Bag',
612             },
613             MaxAvailHeight => { Groups => { 2 => 'Image' }, Writable => 'integer' },
614             MaxAvailWidth => { Groups => { 2 => 'Image' }, Writable => 'integer' },
615             ModelAge => { List => 'Bag', Writable => 'integer' },
616             OrganisationInImageCode => { List => 'Bag' },
617             OrganisationInImageName => { List => 'Bag' },
618             PersonInImage => { List => 'Bag' },
619             PersonInImageWDetails => {
620             Struct => {
621             STRUCT_NAME => 'PersonDetails',
622             NAMESPACE => 'Iptc4xmpExt',
623             PersonId => { List => 'Bag' },
624             PersonName => { Writable => 'lang-alt' },
625             PersonCharacteristic => {
626             Struct => \%sCVTermDetails,
627             List => 'Bag',
628             },
629             PersonDescription => { Writable => 'lang-alt' },
630             },
631             List => 'Bag',
632             },
633             PersonInImageWDetailsPersonId => { Flat => 1, Name => 'PersonInImageId' },
634             PersonInImageWDetailsPersonName => { Flat => 1, Name => 'PersonInImageName' },
635             PersonInImageWDetailsPersonCharacteristic => { Flat => 1, Name => 'PersonInImageCharacteristic' },
636             PersonInImageWDetailsPersonCharacteristicCvId => { Flat => 1, Name => 'PersonInImageCvTermCvId' },
637             PersonInImageWDetailsPersonCharacteristicCvTermId => { Flat => 1, Name => 'PersonInImageCvTermId' },
638             PersonInImageWDetailsPersonCharacteristicCvTermName => { Flat => 1, Name => 'PersonInImageCvTermName' },
639             PersonInImageWDetailsPersonCharacteristicCvTermRefinedAbout => { Flat => 1, Name => 'PersonInImageCvTermRefinedAbout' },
640             PersonInImageWDetailsPersonDescription => { Flat => 1, Name => 'PersonInImageDescription' },
641             ProductInImage => {
642             Struct => {
643             STRUCT_NAME => 'ProductDetails',
644             NAMESPACE => 'Iptc4xmpExt',
645             ProductName => { Writable => 'lang-alt' },
646             ProductGTIN => { },
647             ProductDescription => { Writable => 'lang-alt' },
648             ProductId => { }, # added in version 2022.1
649             },
650             List => 'Bag',
651             },
652             ProductInImageProductName => { Flat => 1, Name => 'ProductInImageName' },
653             ProductInImageProductGTIN => { Flat => 1, Name => 'ProductInImageGTIN' },
654             ProductInImageProductDescription => { Flat => 1, Name => 'ProductInImageDescription' },
655             RegistryId => {
656             Name => 'RegistryID',
657             Struct => {
658             STRUCT_NAME => 'RegistryEntryDetails',
659             NAMESPACE => 'Iptc4xmpExt',
660             RegItemId => { },
661             RegOrgId => { },
662             RegEntryRole=> { }, # (new in 1.3)
663             },
664             List => 'Bag',
665             },
666             RegistryIdRegItemId => { Flat => 1, Name => 'RegistryItemID' },
667             RegistryIdRegOrgId => { Flat => 1, Name => 'RegistryOrganisationID' },
668             RegistryIdRegEntryRole => { Flat => 1, Name => 'RegistryEntryRole' },
669              
670             # new Extension 1.3 properties
671             Genre => { Groups => { 2 => 'Image' }, List => 'Bag', Struct => \%sCVTermDetails },
672              
673             # new video properties (Oct 2016, ref Michael Steidl)
674             # (see http://www.iptc.org/std/videometadatahub/recommendation/IPTC-VideoMetadataHub-props-Rec_1.0.html)
675             CircaDateCreated=> { Groups => { 2 => 'Time' } },
676             Episode => { Groups => { 2 => 'Video' }, Struct => \%sEpisode },
677             ExternalMetadataLink => { Groups => { 2 => 'Other' }, List => 'Bag' },
678             FeedIdentifier => { Groups => { 2 => 'Video' } },
679             PublicationEvent=> { Groups => { 2 => 'Video' }, List => 'Bag', Struct => \%sPublicationEvent },
680             Rating => {
681             Groups => { 2 => 'Other' },
682             Struct => \%sRating,
683             List => 'Bag',
684             },
685             ReleaseReady => { Groups => { 2 => 'Other' }, Writable => 'boolean' },
686             Season => { Groups => { 2 => 'Video' }, Struct => \%sEpisode },
687             Series => { Groups => { 2 => 'Video' }, Struct => \%sSeries },
688             StorylineIdentifier => { Groups => { 2 => 'Video' }, List => 'Bag' },
689             StylePeriod => { Groups => { 2 => 'Video' } },
690             TemporalCoverage=> { Groups => { 2 => 'Video' }, Struct => \%sTemporalCoverage },
691             WorkflowTag => { Groups => { 2 => 'Video' }, Struct => \%sCVTermDetails },
692             DataOnScreen => { Groups => { 2 => 'Video' }, List => 'Bag', Struct => \%sTextRegion },
693             Dopesheet => { Groups => { 2 => 'Video' }, Writable => 'lang-alt' },
694             DopesheetLink => { Groups => { 2 => 'Video' }, List => 'Bag', Struct => \%sQualifiedLink },
695             Headline => { Groups => { 2 => 'Video' }, Writable => 'lang-alt', Avoid => 1 },
696             PersonHeard => { Groups => { 2 => 'Audio' }, List => 'Bag', Struct => \%sEntity },
697             VideoShotType => { Groups => { 2 => 'Video' }, List => 'Bag', Struct => \%sEntity },
698             EventExt => { Groups => { 2 => 'Video' }, List => 'Bag', Struct => \%sEntity, Name => 'ShownEvent' },
699             Transcript => { Groups => { 2 => 'Video' }, Writable => 'lang-alt' },
700             TranscriptLink => { Groups => { 2 => 'Video' }, List => 'Bag', Struct => \%sQualifiedLink },
701             VisualColour => {
702             Name => 'VisualColor',
703             Groups => { 2 => 'Video' },
704             PrintConv => {
705             'bw-monochrome' => 'Monochrome',
706             'colour' => 'Color',
707             },
708             },
709             Contributor => { List => 'Bag', Struct => \%sEntityWithRole },
710             CopyrightYear => { Groups => { 2 => 'Time' }, Writable => 'integer' },
711             Creator => { List => 'Bag', Struct => \%sEntityWithRole },
712             SupplyChainSource => { Groups => { 2 => 'Other' }, List => 'Bag', Struct => \%sEntity },
713             audioBitRate => { Groups => { 2 => 'Audio' }, Writable => 'integer', Name => 'AudioBitrate' },
714             audioBitRateMode=> {
715             Name => 'AudioBitrateMode',
716             Groups => { 2 => 'Audio' },
717             PrintConv => {
718             fixed => 'Fixed',
719             variable => 'Variable',
720             },
721             },
722             audioChannelCount => { Groups => { 2 => 'Audio' }, Writable => 'integer' },
723             videoDisplayAspectRatio => { Groups => { 2 => 'Audio' }, Writable => 'rational' },
724             ContainerFormat => { Groups => { 2 => 'Video' }, Struct => \%sEntity },
725             StreamReady => {
726             Groups => { 2 => 'Video' },
727             PrintConv => {
728             true => 'True',
729             false => 'False',
730             unknown => 'Unknown',
731             },
732             },
733             videoBitRate => { Groups => { 2 => 'Video' }, Writable => 'integer', Name => 'VideoBitrate' },
734             videoBitRateMode => {
735             Name => 'VideoBitrateMode',
736             Groups => { 2 => 'Video' },
737             PrintConv => {
738             fixed => 'Fixed',
739             variable => 'Variable',
740             },
741             },
742             videoEncodingProfile => { Groups => { 2 => 'Video' } },
743             videoStreamsCount => { Groups => { 2 => 'Video' }, Writable => 'integer' },
744             # new IPTC video metadata 1.1 properties
745             # (ref https://www.iptc.org/std/videometadatahub/recommendation/IPTC-VideoMetadataHub-props-Rec_1.1.html)
746             SnapshotLink => { Groups => { 2 => 'Image' }, List => 'Bag', Struct => \%sLinkedImage, Name => 'Snapshot' },
747             # new IPTC video metadata 1.2 properties
748             # (ref http://www.iptc.org/std/videometadatahub/recommendation/IPTC-VideoMetadataHub-props-Rec_1.2.html)
749             RecDevice => {
750             Groups => { 2 => 'Device' },
751             Struct => {
752             STRUCT_NAME => 'Device',
753             NAMESPACE => 'Iptc4xmpExt',
754             Manufacturer => { },
755             ModelName => { },
756             SerialNumber => { },
757             AttLensDescription => { },
758             OwnersDeviceId => { },
759             },
760             },
761             PlanningRef => { List => 'Bag', Struct => \%sEntityWithRole },
762             audioBitsPerSample => { Groups => { 2 => 'Audio' }, Writable => 'integer' },
763             # new IPTC video metadata 1.3 properties
764             # (ref https://iptc.org/std/videometadatahub/recommendation/IPTC-VideoMetadataHub-props-Rec_1.3.html)
765             metadataLastEdited => { Groups => { 2 => 'Time' }, %dateTimeInfo },
766             metadataLastEditor => { Struct => \%sEntity },
767             metadataAuthority => { Struct => \%sEntity },
768             parentId => { Name => 'ParentID' },
769             # new IPTC Extension schema 1.5 property
770             ImageRegion => { Groups => { 2 => 'Image' }, List => 'Bag', Struct => \%sImageRegion },
771             # new Extension 1.6 property
772             EventId => { Name => 'EventID', List => 'Bag' },
773             # new AI tags
774             AISystemUsed => { },
775             AISystemVersionUsed => { },
776             AIPromptInformation => { },
777             AIPromptWriterName => { },
778             );
779              
780             #------------------------------------------------------------------------------
781             # PRISM
782             #
783             # NOTE: The "Avoid" flag is set for all PRISM tags (via tag table AVOID flag)
784              
785             # my %obsolete = (
786             # Notes => 'obsolete in 2.0',
787             # ValueConvInv => sub {
788             # my ($val, $self) = @_;
789             # unless ($self->Options('IgnoreMinorErrors')) {
790             # warn "Warning: [minor] Attempt to write obsolete tag\n";
791             # return undef;
792             # }
793             # return $val;
794             # }
795             # );
796              
797             # PRISM structure definitions
798             my %prismPublicationDate = (
799             STRUCT_NAME => 'prismPublicationDate',
800             NAMESPACE => 'prism',
801             date => { %dateTimeInfo, Groups => { 2 => 'Time'} },
802             'a-platform'=> { },
803             );
804              
805             # Publishing Requirements for Industry Standard Metadata (prism) (ref 2)
806             %Image::ExifTool::XMP::prism = (
807             %xmpTableDefaults,
808             GROUPS => { 0 => 'XMP', 1 => 'XMP-prism', 2 => 'Document' },
809             NAMESPACE => 'prism',
810             AVOID => 1,
811             NOTES => q{
812             Publishing Requirements for Industry Standard Metadata 3.0 namespace
813             tags. (see
814             L)
815             },
816             academicField => { }, # (3.0)
817             aggregateIssueNumber => { Writable => 'integer' }, # (3.0)
818             aggregationType => { List => 'Bag' },
819             alternateTitle => {
820             List => 'Bag',
821             Struct => { # (becomes a structure in 3.0)
822             STRUCT_NAME => 'prismAlternateTitle',
823             NAMESPACE => 'prism',
824             text => { },
825             'a-platform'=> { },
826             'a-lang' => { },
827             },
828             },
829             blogTitle => { }, # (3.0)
830             blogURL => { }, # (3.0)
831             bookEdition => { }, # (3.0)
832             byteCount => { Writable => 'integer' },
833             channel => {
834             List => 'Bag',
835             Struct => { # (becomes a structure in 3.0)
836             STRUCT_NAME => 'prismChannel',
837             NAMESPACE => 'prism',
838             channel => { },
839             subchannel1 => { },
840             subchannel2 => { },
841             subchannel3 => { },
842             subchannel4 => { },
843             'a-lang' => { },
844             },
845             },
846             complianceProfile=>{ PrintConv => { three => 'Three' } },
847             contentType => { }, # (3.0)
848             copyrightYear => { }, # (3.0)
849             # copyright => { Groups => { 2 => 'Author' } }, # (deprecated in 3.0)
850             corporateEntity => { List => 'Bag' },
851             coverDate => { %dateTimeInfo, Groups => { 2 => 'Time'} },
852             coverDisplayDate=> { },
853             creationDate => { %dateTimeInfo, Groups => { 2 => 'Time'} },
854             dateRecieved => { %dateTimeInfo, Groups => { 2 => 'Time'} },
855             device => { }, # (3.0)
856             distributor => { },
857             doi => { Name => 'DOI', Description => 'Digital Object Identifier' },
858             edition => { },
859             eIssn => { },
860             #embargoDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} }, # (deprecated in 3.0)
861             endingPage => { },
862             event => { List => 'Bag' },
863             #expirationDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} }, # (deprecated in 3.0)
864             genre => { List => 'Bag' },
865             hasAlternative => { List => 'Bag' },
866             hasCorrection => {
867             Struct => { # (becomes a structure in 3.0)
868             STRUCT_NAME => 'prismHasCorrection',
869             NAMESPACE => 'prism',
870             text => { },
871             'a-platform'=> { },
872             'a-lang' => { },
873             },
874             },
875             # hasPreviousVersion => { }, # (not in 3.0)
876             hasTranslation => { List => 'Bag' },
877             industry => { List => 'Bag' },
878             isAlternativeOf => { List => 'Bag' }, # (3.0)
879             isbn => { Name => 'ISBN', List => 'Bag' }, # 2.1 (becomes a list in 3.0)
880             isCorrectionOf => { List => 'Bag' },
881             issn => { Name => 'ISSN' },
882             issueIdentifier => { },
883             issueName => { },
884             issueTeaser => { }, # (3.0)
885             issueType => { }, # (3.0)
886             isTranslationOf => { },
887             keyword => { List => 'Bag' },
888             killDate => {
889             Struct => { # (becomes a structure in 3.0)
890             STRUCT_NAME => 'prismKillDate',
891             NAMESPACE => 'prism',
892             date => { %dateTimeInfo, Groups => { 2 => 'Time'} },
893             'a-platform'=> { }, #PH (missed in spec?)
894             },
895             },
896             'link' => { List => 'Bag' }, # (3.0)
897             location => { List => 'Bag' },
898             # metadataContainer => { }, (not valid for PRISM XMP)
899             modificationDate=> { %dateTimeInfo, Groups => { 2 => 'Time'} },
900             nationalCatalogNumber => { }, # (3.0)
901             number => { },
902             object => { List => 'Bag' },
903             onSaleDate => { # (3.0)
904             List => 'Bag',
905             Struct => {
906             STRUCT_NAME => 'prismOnSaleDate',
907             NAMESPACE => 'prism',
908             date => { %dateTimeInfo, Groups => { 2 => 'Time'} },
909             'a-platform'=> { },
910             },
911             },
912             onSaleDay => { # (3.0)
913             List => 'Bag',
914             Struct => {
915             STRUCT_NAME => 'prismOnSaleDay',
916             NAMESPACE => 'prism',
917             day => { }, #PH (not named in spec)
918             'a-platform'=> { },
919             },
920             },
921             offSaleDate => { # (3.0)
922             List => 'Bag',
923             Struct => {
924             STRUCT_NAME => 'prismOffSaleDate',
925             NAMESPACE => 'prism',
926             date => { %dateTimeInfo, Groups => { 2 => 'Time'} },
927             'a-platform'=> { },
928             },
929             },
930             organization => { List => 'Bag' },
931             originPlatform => {
932             List => 'Bag',
933             PrintConv => {
934             email => 'E-Mail',
935             mobile => 'Mobile',
936             broadcast => 'Broadcast',
937             web => 'Web',
938             'print' => 'Print',
939             recordableMedia => 'Recordable Media',
940             other => 'Other',
941             },
942             },
943             pageCount => { Writable => 'integer' }, # (3.0)
944             pageProgressionDirection => { # (3.0)
945             PrintConv => { LTR => 'Left to Right', RTL => 'Right to Left' },
946             },
947             pageRange => { List => 'Bag' },
948             person => { },
949             platform => { }, # (3.0)
950             productCode => { }, # (3.0)
951             profession => { }, # (3.0)
952             publicationDate => {
953             List => 'Bag',
954             Struct => \%prismPublicationDate, # (becomes a structure in 3.0)
955             },
956             publicationDisplayDate => { # (3.0)
957             List => 'Bag',
958             Struct => \%prismPublicationDate,
959             },
960             publicationName => { },
961             publishingFrequency => { }, # (3.0)
962             rating => { },
963             # rightsAgent => { }, # (deprecated in 3.0)
964             samplePageRange => { }, # (3.0)
965             section => { },
966             sellingAgency => { }, # (3.0)
967             seriesNumber => { Writable => 'integer' }, # (3.0)
968             seriesTitle => { }, # (3.0)
969             sport => { }, # (3.0)
970             startingPage => { },
971             subsection1 => { },
972             subsection2 => { },
973             subsection3 => { },
974             subsection4 => { },
975             subtitle => { }, # (3.0)
976             supplementDisplayID => { }, # (3.0)
977             supplementStartingPage => { }, # (3.0)
978             supplementTitle => { }, # (3.0)
979             teaser => { List => 'Bag' },
980             ticker => { List => 'Bag' },
981             timePeriod => { },
982             url => {
983             Name => 'URL',
984             List => 'Bag',
985             Struct => { # (becomes a structure in 3.0)
986             STRUCT_NAME => 'prismUrl',
987             NAMESPACE => 'prism',
988             url => { },
989             'a-platform'=> { },
990             },
991             },
992             uspsNumber => { }, # (3.0)
993             versionIdentifier => { },
994             volume => { },
995             wordCount => { Writable => 'integer' },
996             # tags that existed in version 1.3
997             # category => { %obsolete, List => 'Bag' },
998             # hasFormat => { %obsolete, List => 'Bag' },
999             # hasPart => { %obsolete, List => 'Bag' },
1000             # isFormatOf => { %obsolete, List => 'Bag' },
1001             # isPartOf => { %obsolete },
1002             # isReferencedBy => { %obsolete, List => 'Bag' },
1003             # isRequiredBy => { %obsolete, List => 'Bag' },
1004             # isVersionOf => { %obsolete },
1005             # objectTitle => { %obsolete, List => 'Bag' },
1006             # receptionDate => { %obsolete },
1007             # references => { %obsolete, List => 'Bag' },
1008             # requires => { %obsolete, List => 'Bag' },
1009             # tags in older versions
1010             # page
1011             # contentLength
1012             # creationTime
1013             # expirationTime
1014             # hasVersion
1015             # isAlternativeFor
1016             # isBasedOn
1017             # isBasisFor
1018             # modificationTime
1019             # publicationTime
1020             # receptionTime
1021             # releaseTime
1022             );
1023              
1024             # PRISM Rights Language namespace (prl) (ref 2)
1025             %Image::ExifTool::XMP::prl = (
1026             %xmpTableDefaults,
1027             GROUPS => { 0 => 'XMP', 1 => 'XMP-prl', 2 => 'Document' },
1028             NAMESPACE => 'prl',
1029             AVOID => 1,
1030             NOTES => q{
1031             PRISM Rights Language 2.1 namespace tags. These tags have been deprecated
1032             since the release of the PRISM Usage Rights 3.0. (see
1033             L)
1034             },
1035             geography => { List => 'Bag' },
1036             industry => { List => 'Bag' },
1037             usage => { List => 'Bag' },
1038             );
1039              
1040             # PRISM Usage Rights namespace (prismusagerights) (ref 2)
1041             %Image::ExifTool::XMP::pur = (
1042             %xmpTableDefaults,
1043             GROUPS => { 0 => 'XMP', 1 => 'XMP-pur', 2 => 'Document' },
1044             NAMESPACE => 'pur',
1045             AVOID => 1,
1046             NOTES => q{
1047             PRISM Usage Rights 3.0 namespace tags. (see
1048             L)
1049             },
1050             adultContentWarning => { List => 'Bag' },
1051             agreement => { List => 'Bag' },
1052             copyright => {
1053             # (not clear in 3.0 spec, which lists only "bag Text", and called
1054             # "copyrightDate" instead of "copyright" the PRISM basic 3.0 spec)
1055             Writable => 'lang-alt',
1056             Groups => { 2 => 'Author' },
1057             },
1058             creditLine => { List => 'Bag' },
1059             embargoDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
1060             exclusivityEndDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
1061             expirationDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
1062             imageSizeRestriction=> { },
1063             optionEndDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
1064             permissions => { List => 'Bag' },
1065             restrictions => { List => 'Bag' },
1066             reuseProhibited => { Writable => 'boolean' },
1067             rightsAgent => { },
1068             rightsOwner => { },
1069             # usageFee => { List => 'Bag' }, # (not in 3.0)
1070             );
1071              
1072             # PRISM Metadata for Images namespace (pmi) (ref 2)
1073             %Image::ExifTool::XMP::pmi = (
1074             %xmpTableDefaults,
1075             GROUPS => { 0 => 'XMP', 1 => 'XMP-pmi', 2 => 'Image' },
1076             NAMESPACE => 'pmi',
1077             AVOID => 1,
1078             NOTES => q{
1079             PRISM Metadata for Images 3.0 namespace tags. (see
1080             L)
1081             },
1082             color => {
1083             PrintConv => {
1084             bw => 'BW',
1085             color => 'Color',
1086             sepia => 'Sepia',
1087             duotone => 'Duotone',
1088             tritone => 'Tritone',
1089             quadtone => 'Quadtone',
1090             },
1091             },
1092             contactInfo => { },
1093             displayName => { },
1094             distributorProductID => { },
1095             eventAlias => { },
1096             eventEnd => { },
1097             eventStart => { },
1098             eventSubtype => { },
1099             eventType => { },
1100             field => { },
1101             framing => { },
1102             location => { },
1103             make => { },
1104             manufacturer => { },
1105             model => { },
1106             modelYear => { },
1107             objectDescription=>{ },
1108             objectSubtype => { },
1109             objectType => { },
1110             orientation => {
1111             PrintConv => {
1112             horizontal => 'Horizontal',
1113             vertical => 'Vertical',
1114             }
1115             },
1116             positionDescriptor => { },
1117             productID => { },
1118             productIDType => { },
1119             season => {
1120             PrintConv => {
1121             spring => 'Spring',
1122             summer => 'Summer',
1123             fall => 'Fall',
1124             winter => 'Winter',
1125             },
1126             },
1127             sequenceName => { },
1128             sequenceNumber => { },
1129             sequenceTotalNumber => { },
1130             setting => { },
1131             shootID => { },
1132             slideshowName => { },
1133             slideshowNumber => { Writable => 'integer' },
1134             slideshowTotalNumber => { Writable => 'integer' },
1135             viewpoint => { },
1136             visualTechnique => { },
1137             );
1138              
1139             # PRISM Recipe Metadata (prm) (ref 2)
1140             %Image::ExifTool::XMP::prm = (
1141             %xmpTableDefaults,
1142             GROUPS => { 0 => 'XMP', 1 => 'XMP-prm', 2 => 'Document' },
1143             NAMESPACE => 'prm',
1144             AVOID => 1,
1145             NOTES => q{
1146             PRISM Recipe Metadata 3.0 namespace tags. (see
1147             L)
1148             },
1149             cookingEquipment => { },
1150             cookingMethod => { },
1151             course => { },
1152             cuisine => { },
1153             dietaryNeeds => { },
1154             dishType => { },
1155             duration => { },
1156             ingredientExclusion => { },
1157             mainIngredient => { },
1158             meal => { },
1159             recipeEndingPage => { },
1160             recipePageRange => { },
1161             recipeSource => { },
1162             recipeStartingPage => { },
1163             recipeTitle => { },
1164             servingSize => { },
1165             skillLevel => { },
1166             specialOccasion => { },
1167             yield => { },
1168             );
1169              
1170             #------------------------------------------------------------------------------
1171              
1172             # DICOM namespace properties (DICOM) (ref PH, written by CS3)
1173             %Image::ExifTool::XMP::DICOM = (
1174             %xmpTableDefaults,
1175             GROUPS => { 1 => 'XMP-DICOM', 2 => 'Image' },
1176             NAMESPACE => 'DICOM',
1177             NOTES => q{
1178             DICOM namespace tags. These XMP tags allow some DICOM information to be
1179             stored in files of other than DICOM format. See the
1180             L for a list
1181             of tags available in DICOM-format files.
1182             },
1183             # change some tag names to correspond with DICOM tags
1184             PatientName => { },
1185             PatientID => { },
1186             PatientSex => { },
1187             PatientDOB => {
1188             Name => 'PatientBirthDate',
1189             Groups => { 2 => 'Time' },
1190             %dateTimeInfo,
1191             },
1192             StudyID => { },
1193             StudyPhysician => { },
1194             StudyDateTime => { Groups => { 2 => 'Time' }, %dateTimeInfo },
1195             StudyDescription => { },
1196             SeriesNumber => { },
1197             SeriesModality => { },
1198             SeriesDateTime => { Groups => { 2 => 'Time' }, %dateTimeInfo },
1199             SeriesDescription => { },
1200             EquipmentInstitution => { },
1201             EquipmentManufacturer => { },
1202             );
1203              
1204             # PixelLive namespace properties (PixelLive) (ref 3)
1205             %Image::ExifTool::XMP::PixelLive = (
1206             GROUPS => { 1 => 'XMP-PixelLive', 2 => 'Image' },
1207             NAMESPACE => 'PixelLive',
1208             AVOID => 1,
1209             NOTES => q{
1210             PixelLive namespace tags. These tags are not writable because they are very
1211             uncommon and I haven't been able to locate a reference which gives the
1212             namespace URI.
1213             },
1214             AUTHOR => { Name => 'Author', Groups => { 2 => 'Author' } },
1215             COMMENTS => { Name => 'Comments' },
1216             COPYRIGHT => { Name => 'Copyright', Groups => { 2 => 'Author' } },
1217             DATE => { Name => 'Date', Groups => { 2 => 'Time' } },
1218             GENRE => { Name => 'Genre' },
1219             TITLE => { Name => 'Title' },
1220             );
1221              
1222             # Extensis Portfolio tags (extensis) (ref 11)
1223             %Image::ExifTool::XMP::extensis = (
1224             %xmpTableDefaults,
1225             GROUPS => { 1 => 'XMP-extensis', 2 => 'Image' },
1226             NAMESPACE => 'extensis',
1227             NOTES => 'Tags used by Extensis Portfolio.',
1228             Approved => { Writable => 'boolean' },
1229             ApprovedBy => { },
1230             ClientName => { },
1231             JobName => { },
1232             JobStatus => { },
1233             RoutedTo => { },
1234             RoutingNotes => { },
1235             WorkToDo => { },
1236             );
1237              
1238             # IDimager structures (ref PH)
1239             my %sTagStruct;
1240             %sTagStruct = (
1241             STRUCT_NAME => 'TagStructure',
1242             NAMESPACE => 'ics',
1243             LabelName => { },
1244             Reference => { },
1245             ParentReference => { },
1246             SubLabels => { Struct => \%sTagStruct, List => 'Bag' },
1247             );
1248             my %sSubVersion = (
1249             STRUCT_NAME => 'SubVersion',
1250             NAMESPACE => 'ics',
1251             VersRef => { },
1252             FileName => { },
1253             );
1254              
1255             # IDimager namespace (ics) (ref PH)
1256             %Image::ExifTool::XMP::ics = (
1257             %xmpTableDefaults,
1258             GROUPS => { 0 => 'XMP', 1 => 'XMP-ics', 2 => 'Image' },
1259             NAMESPACE => 'ics',
1260             NOTES => q{
1261             Tags used by IDimager. Nested TagStructure structures are unrolled to an
1262             arbitrary depth of 6 to avoid infinite recursion.
1263             },
1264             ImageRef => { },
1265             TagStructure => { Struct => \%sTagStruct, List => 'Bag' },
1266             TagStructureLabelName => { Name => 'LabelName1', Flat => 1 },
1267             TagStructureReference => { Name => 'Reference1', Flat => 1 },
1268             TagStructureSubLabels => { Name => 'SubLabels1', Flat => 1 },
1269             TagStructureParentReference => { Name => 'ParentReference1', Flat => 1 },
1270             TagStructureSubLabelsLabelName => { Name => 'LabelName2', Flat => 1 },
1271             TagStructureSubLabelsReference => { Name => 'Reference2', Flat => 1 },
1272             TagStructureSubLabelsSubLabels => { Name => 'SubLabels2', Flat => 1 },
1273             TagStructureSubLabelsParentReference => { Name => 'ParentReference2', Flat => 1 },
1274             TagStructureSubLabelsSubLabelsLabelName => { Name => 'LabelName3', Flat => 1 },
1275             TagStructureSubLabelsSubLabelsReference => { Name => 'Reference3', Flat => 1 },
1276             TagStructureSubLabelsSubLabelsSubLabels => { Name => 'SubLabels3', Flat => 1 },
1277             TagStructureSubLabelsSubLabelsParentReference => { Name => 'ParentReference3', Flat => 1 },
1278             TagStructureSubLabelsSubLabelsSubLabelsLabelName => { Name => 'LabelName4', Flat => 1 },
1279             TagStructureSubLabelsSubLabelsSubLabelsReference => { Name => 'Reference4', Flat => 1 },
1280             TagStructureSubLabelsSubLabelsSubLabelsSubLabels => { Name => 'SubLabels4', Flat => 1 },
1281             TagStructureSubLabelsSubLabelsSubLabelsParentReference => { Name => 'ParentReference4', Flat => 1 },
1282             TagStructureSubLabelsSubLabelsSubLabelsSubLabelsLabelName => { Name => 'LabelName5', Flat => 1 },
1283             TagStructureSubLabelsSubLabelsSubLabelsSubLabelsReference => { Name => 'Reference5', Flat => 1 },
1284             TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabels => { Name => 'SubLabels5', Flat => 1, NoSubStruct => 1 }, # break infinite recursion
1285             TagStructureSubLabelsSubLabelsSubLabelsSubLabelsParentReference => { Name => 'ParentReference5', Flat => 1 },
1286             TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsLabelName => { Name => 'LabelName6', Flat => 1 },
1287             TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsReference => { Name => 'Reference6', Flat => 1 },
1288             TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsParentReference => { Name => 'ParentReference6', Flat => 1 },
1289             SubVersions => { Struct => \%sSubVersion, List => 'Bag' },
1290             SubVersionsVersRef => { Name => 'SubVersionReference', Flat => 1 },
1291             SubVersionsFileName => { Name => 'SubVersionFileName', Flat => 1 },
1292             TimeStamp => { Avoid => 1, Groups => { 2 => 'Time' }, %dateTimeInfo },
1293             AppVersion => { Avoid => 1 },
1294             );
1295              
1296             # ACDSee namespace (acdsee) (ref PH)
1297             %Image::ExifTool::XMP::acdsee = (
1298             %xmpTableDefaults,
1299             GROUPS => { 0 => 'XMP', 1 => 'XMP-acdsee', 2 => 'Image' },
1300             NAMESPACE => 'acdsee',
1301             AVOID => 1,
1302             NOTES => q{
1303             ACD Systems ACDSee namespace tags.
1304              
1305             (A note to software developers: Re-inventing your own private tags instead
1306             of using the equivalent tags in standard XMP namespaces defeats one of the
1307             most valuable features of metadata: interoperability. Your applications
1308             mumble to themselves instead of speaking out for the rest of the world to
1309             hear.)
1310             },
1311             author => { Groups => { 2 => 'Author' } },
1312             caption => { },
1313             categories => { },
1314             collections=> { },
1315             datetime => { Name => 'DateTime', Groups => { 2 => 'Time' }, %dateTimeInfo },
1316             keywords => { List => 'Bag' },
1317             notes => { },
1318             rating => { Writable => 'real' }, # integer?
1319             tagged => { Writable => 'boolean' },
1320             rawrppused => { Writable => 'boolean' },
1321             rpp => {
1322             Name => 'RPP',
1323             Writable => 'lang-alt',
1324             Notes => 'raw processing settings in XML format',
1325             Binary => 1,
1326             },
1327             dpp => {
1328             Name => 'DPP',
1329             Writable => 'lang-alt',
1330             Notes => 'newer version of XML raw processing settings',
1331             Binary => 1,
1332             },
1333             # more tags (ref forum6840)
1334             FixtureIdentifier => { },
1335             EditStatus => { },
1336             ReleaseDate => { },
1337             ReleaseTime => { },
1338             OriginatingProgram => { },
1339             ObjectCycle => { },
1340             Snapshots => { List => 'Bag', Binary => 1 },
1341             );
1342              
1343             # ACDSee region tags (ref BKW)
1344             my %sACDSeeDimensions = (
1345             STRUCT_NAME => 'ACDSeeDimensions',
1346             NAMESPACE => {'acdsee-stDim' => 'http://ns.acdsee.com/sType/Dimensions#'},
1347             'w' => { Writable => 'real' },
1348             'h' => { Writable => 'real' },
1349             'unit' => { },
1350             );
1351             my %sACDSeeArea = (
1352             STRUCT_NAME => 'ACDSeeArea',
1353             NAMESPACE => { 'acdsee-stArea' => 'http://ns.acdsee.com/sType/Area#' },
1354             'x' => { Writable => 'real' },
1355             'y' => { Writable => 'real' },
1356             w => { Writable => 'real' },
1357             h => { Writable => 'real' },
1358             );
1359             my %sACDSeeRegionStruct = (
1360             STRUCT_NAME => 'ACDSeeRegion',
1361             NAMESPACE => 'acdsee-rs',
1362             ALGArea => { Struct => \%sACDSeeArea },
1363             DLYArea => { Struct => \%sACDSeeArea },
1364             Name => { },
1365             NameAssignType => { },
1366             Type => { },
1367             );
1368             %Image::ExifTool::XMP::ACDSeeRegions = (
1369             GROUPS => { 0 => 'XMP', 1 => 'XMP-acdsee-rs', 2 => 'Image' },
1370             NAMESPACE => 'acdsee-rs',
1371             WRITABLE => 'string',
1372             AVOID => 1,
1373             Regions => {
1374             Name => 'RegionInfoACDSee',
1375             FlatName => 'ACDSee',
1376             # the "Struct" entry defines the structure fields
1377             Struct => {
1378             # optional structure name (used for warning messages only)
1379             STRUCT_NAME => 'ACDSeeRegionInfo',
1380             NAMESPACE => 'acdsee-rs',
1381             RegionList => {
1382             FlatName => 'Region',
1383             Struct => \%sACDSeeRegionStruct,
1384             List => 'Bag',
1385             },
1386             AppliedToDimensions => {
1387             FlatName => 'RegionAppliedToDimensions',
1388             Struct => \%sACDSeeDimensions,
1389             },
1390             },
1391             },
1392             );
1393              
1394             # Picture Licensing Universal System namespace properties (xmpPLUS)
1395             %Image::ExifTool::XMP::xmpPLUS = (
1396             %xmpTableDefaults,
1397             GROUPS => { 1 => 'XMP-xmpPLUS', 2 => 'Author' },
1398             NAMESPACE => 'xmpPLUS',
1399             AVOID => 1,
1400             NOTES => q{
1401             XMP Picture Licensing Universal System (PLUS) tags as written by some older
1402             Adobe applications. See L
1403             for the current PLUS tags.
1404             },
1405             CreditLineReq => { Writable => 'boolean' },
1406             ReuseAllowed => { Writable => 'boolean' },
1407             );
1408              
1409             %Image::ExifTool::XMP::panorama = (
1410             %xmpTableDefaults,
1411             GROUPS => { 1 => 'XMP-panorama', 2 => 'Image' },
1412             NAMESPACE => 'panorama',
1413             NOTES => 'Adobe Photoshop Panorama-profile tags.',
1414             Transformation => { },
1415             VirtualFocalLength => { Writable => 'real' },
1416             VirtualImageXCenter => { Writable => 'real' },
1417             VirtualImageYCenter => { Writable => 'real' },
1418             );
1419              
1420             # Creative Commons namespace properties (cc) (ref 5)
1421             %Image::ExifTool::XMP::cc = (
1422             %xmpTableDefaults,
1423             GROUPS => { 1 => 'XMP-cc', 2 => 'Author' },
1424             NAMESPACE => 'cc',
1425             NOTES => q{
1426             Creative Commons namespace tags. Note that the CC specification for XMP is
1427             non-existent, so ExifTool must make some assumptions about the format of the
1428             specific properties in XMP (see L).
1429             },
1430             # Work properties
1431             license => { Resource => 1 },
1432             attributionName => { },
1433             attributionURL => { Resource => 1 },
1434             morePermissions => { Resource => 1 },
1435             useGuidelines => { Resource => 1 },
1436             # License properties
1437             permits => {
1438             List => 'Bag',
1439             Resource => 1,
1440             PrintConv => {
1441             'cc:Sharing' => 'Sharing',
1442             'cc:DerivativeWorks' => 'Derivative Works',
1443             'cc:Reproduction' => 'Reproduction',
1444             'cc:Distribution' => 'Distribution',
1445             },
1446             },
1447             requires => {
1448             List => 'Bag',
1449             Resource => 1,
1450             PrintConv => {
1451             'cc:Copyleft' => 'Copyleft',
1452             'cc:LesserCopyleft' => 'Lesser Copyleft',
1453             'cc:SourceCode' => 'Source Code',
1454             'cc:ShareAlike' => 'Share Alike',
1455             'cc:Notice' => 'Notice',
1456             'cc:Attribution' => 'Attribution',
1457             },
1458             },
1459             prohibits => {
1460             List => 'Bag',
1461             Resource => 1,
1462             PrintConv => {
1463             'cc:HighIncomeNationUse' => 'High Income Nation Use',
1464             'cc:CommercialUse' => 'Commercial Use',
1465             },
1466             },
1467             jurisdiction => { Resource => 1 },
1468             legalcode => { Name => 'LegalCode', Resource => 1 },
1469             deprecatedOn => { %dateTimeInfo, Groups => { 2 => 'Time' } },
1470             );
1471              
1472             # Description Explorer namespace properties (dex) (ref 6)
1473             %Image::ExifTool::XMP::dex = (
1474             %xmpTableDefaults,
1475             GROUPS => { 1 => 'XMP-dex', 2 => 'Image' },
1476             NAMESPACE => 'dex',
1477             NOTES => q{
1478             Description Explorer namespace tags. These tags are not very common. The
1479             Source and Rating tags are avoided when writing due to name conflicts with
1480             other XMP tags. (see L)
1481             },
1482             crc32 => { Name => 'CRC32', Writable => 'integer' },
1483             source => { Avoid => 1 },
1484             shortdescription => {
1485             Name => 'ShortDescription',
1486             Writable => 'lang-alt',
1487             },
1488             licensetype => {
1489             Name => 'LicenseType',
1490             PrintConv => {
1491             unknown => 'Unknown',
1492             shareware => 'Shareware',
1493             freeware => 'Freeware',
1494             adware => 'Adware',
1495             demo => 'Demo',
1496             commercial => 'Commercial',
1497             'public domain' => 'Public Domain',
1498             'open source' => 'Open Source',
1499             },
1500             },
1501             revision => { },
1502             rating => { Avoid => 1 },
1503             os => { Name => 'OS', Writable => 'integer' },
1504             ffid => { Name => 'FFID' },
1505             );
1506              
1507             # iView MediaPro namespace properties (mediapro) (ref PH)
1508             %Image::ExifTool::XMP::MediaPro = (
1509             %xmpTableDefaults,
1510             GROUPS => { 1 => 'XMP-mediapro', 2 => 'Image' },
1511             NAMESPACE => 'mediapro',
1512             NOTES => 'iView MediaPro namespace tags.',
1513             Event => {
1514             Avoid => 1,
1515             Notes => 'avoided due to conflict with XMP-iptcExt:Event',
1516             },
1517             Location => {
1518             Avoid => 1,
1519             Groups => { 2 => 'Location' },
1520             Notes => 'avoided due to conflict with XMP-iptcCore:Location',
1521             },
1522             Status => { },
1523             People => { List => 'Bag' },
1524             UserFields => { List => 'Bag' },
1525             CatalogSets => { List => 'Bag' },
1526             );
1527              
1528             # Microsoft ExpressionMedia namespace properties (expressionmedia)
1529             # (ref https://exiftool.org/forum/index.php/topic,4235.0.html)
1530             %Image::ExifTool::XMP::ExpressionMedia = (
1531             %xmpTableDefaults,
1532             GROUPS => { 1 => 'XMP-expressionmedia', 2 => 'Image' },
1533             NAMESPACE => 'expressionmedia',
1534             AVOID => 1,
1535             NOTES => q{
1536             Microsoft Expression Media namespace tags. These tags are avoided when
1537             writing due to name conflicts with tags in other schemas.
1538             },
1539             Event => { },
1540             Status => { },
1541             People => { List => 'Bag' },
1542             CatalogSets => { List => 'Bag' },
1543             );
1544              
1545             # DigiKam namespace tags (ref PH)
1546             %Image::ExifTool::XMP::digiKam = (
1547             %xmpTableDefaults,
1548             GROUPS => { 1 => 'XMP-digiKam', 2 => 'Image' },
1549             NAMESPACE => 'digiKam',
1550             NOTES => 'DigiKam namespace tags.',
1551             CaptionsAuthorNames => { Writable => 'lang-alt' },
1552             CaptionsDateTimeStamps => { Writable => 'lang-alt', Groups => { 2 => 'Time' } },
1553             TagsList => { List => 'Seq' },
1554             ColorLabel => { },
1555             PickLabel => { },
1556             ImageHistory => { Avoid => 1, Notes => 'different format from EXIF:ImageHistory' },
1557             LensCorrectionSettings => { },
1558             ImageUniqueID => { Avoid => 1 },
1559             picasawebGPhotoId => { }, #forum14108
1560             );
1561              
1562             # SWF namespace tags (ref PH)
1563             %Image::ExifTool::XMP::swf = (
1564             %xmpTableDefaults,
1565             GROUPS => { 1 => 'XMP-swf', 2 => 'Image' },
1566             NAMESPACE => 'swf',
1567             NOTES => 'Adobe SWF namespace tags.',
1568             type => { Avoid => 1 },
1569             bgalpha => { Name => 'BackgroundAlpha', Writable => 'integer' },
1570             forwardlock => { Name => 'ForwardLock', Writable => 'boolean' },
1571             maxstorage => { Name => 'MaxStorage', Writable => 'integer' }, # (CS5)
1572             );
1573              
1574             # Sony Ericsson cell phone location tags
1575             # refs: http://www.opencellid.org/api
1576             # http://zonetag.research.yahoo.com/faq_location.php
1577             # http://www.cs.columbia.edu/sip/drafts/LIF%20TS%20101%20v2.0.0.pdf
1578             %Image::ExifTool::XMP::cell = (
1579             %xmpTableDefaults,
1580             GROUPS => { 1 => 'XMP-cell', 2 => 'Location' },
1581             NAMESPACE => 'cell',
1582             NOTES => 'Location tags written by some Sony Ericsson phones.',
1583             mcc => { Name => 'MobileCountryCode' },
1584             mnc => { Name => 'MobileNetworkCode' },
1585             lac => { Name => 'LocationAreaCode' },
1586             cellid => { Name => 'CellTowerID' },
1587             cgi => { Name => 'CellGlobalID' },
1588             r => { Name => 'CellR' }, # (what is this? Radius?)
1589             );
1590              
1591             # Apple adjustment settings (ref PH)
1592             %Image::ExifTool::XMP::aas = (
1593             %xmpTableDefaults,
1594             GROUPS => { 1 => 'XMP-aas', 2 => 'Image' },
1595             NAMESPACE => 'aas',
1596             NOTES => 'Apple Adjustment Settings used by iPhone/iPad.',
1597             CropX => { Writable => 'integer', Avoid => 1 },
1598             CropY => { Writable => 'integer', Avoid => 1 },
1599             CropW => { Writable => 'integer', Avoid => 1 },
1600             CropH => { Writable => 'integer', Avoid => 1 },
1601             AffineA => { Writable => 'real' },
1602             AffineB => { Writable => 'real' },
1603             AffineC => { Writable => 'real' },
1604             AffineD => { Writable => 'real' },
1605             AffineX => { Writable => 'real' },
1606             AffineY => { Writable => 'real' },
1607             Vibrance => { Writable => 'real', Avoid => 1 },
1608             Curve0x => { Writable => 'real' },
1609             Curve0y => { Writable => 'real' },
1610             Curve1x => { Writable => 'real' },
1611             Curve1y => { Writable => 'real' },
1612             Curve2x => { Writable => 'real' },
1613             Curve2y => { Writable => 'real' },
1614             Curve3x => { Writable => 'real' },
1615             Curve3y => { Writable => 'real' },
1616             Curve4x => { Writable => 'real' },
1617             Curve4y => { Writable => 'real' },
1618             Shadows => { Writable => 'real', Avoid => 1 },
1619             Highlights => { Writable => 'real', Avoid => 1 },
1620             # the following from StarGeek
1621             FaceBalanceOrigI => { Writable => 'real' },
1622             FaceBalanceOrigQ => { Writable => 'real' },
1623             FaceBalanceStrength => { Writable => 'real' },
1624             FaceBalanceWarmth => { Writable => 'real' },
1625             );
1626              
1627             # Adobe creatorAtom properties (ref PH)
1628             %Image::ExifTool::XMP::creatorAtom = (
1629             %xmpTableDefaults,
1630             GROUPS => { 1 => 'XMP-creatorAtom', 2 => 'Image' },
1631             NAMESPACE => 'creatorAtom',
1632             NOTES => 'Adobe creatorAtom tags, written by After Effects.',
1633             macAtom => {
1634             Struct => {
1635             STRUCT_NAME => 'MacAtom',
1636             NAMESPACE => 'creatorAtom',
1637             applicationCode => { },
1638             invocationAppleEvent => { },
1639             posixProjectPath => { },
1640             },
1641             },
1642             windowsAtom => {
1643             Struct => {
1644             STRUCT_NAME => 'WindowsAtom',
1645             NAMESPACE => 'creatorAtom',
1646             extension => { },
1647             invocationFlags => { },
1648             uncProjectPath => { },
1649             },
1650             },
1651             aeProjectLink => { # (After Effects Project Link)
1652             Struct => {
1653             STRUCT_NAME => 'AEProjectLink',
1654             NAMESPACE => 'creatorAtom',
1655             renderTimeStamp => { Writable => 'integer' },
1656             compositionID => { },
1657             renderQueueItemID => { },
1658             renderOutputModuleIndex => { },
1659             fullPath => { },
1660             },
1661             },
1662             );
1663              
1664             # FastPictureViewer namespace properties (http://www.fastpictureviewer.com/help/#rtfcomments)
1665             %Image::ExifTool::XMP::fpv = (
1666             %xmpTableDefaults,
1667             GROUPS => { 1 => 'XMP-fpv', 2 => 'Image' },
1668             NAMESPACE => 'fpv',
1669             NOTES => q{
1670             Fast Picture Viewer tags (see
1671             L).
1672             },
1673             RichTextComment => { },
1674             );
1675              
1676             # Apple FaceInfo namespace properties (ref PH)
1677             %Image::ExifTool::XMP::apple_fi = (
1678             %xmpTableDefaults,
1679             GROUPS => { 1 => 'XMP-apple-fi', 2 => 'Image' },
1680             NAMESPACE => 'apple-fi',
1681             NOTES => q{
1682             Face information tags written by the Apple iPhone 5 inside the mwg-rs
1683             RegionExtensions.
1684             },
1685             Timestamp => {
1686             Name => 'TimeStamp',
1687             Writable => 'integer',
1688             # (don't know how to convert this)
1689             },
1690             FaceID => { Writable => 'integer' },
1691             AngleInfoRoll => { Writable => 'integer' },
1692             AngleInfoYaw => { Writable => 'integer' },
1693             ConfidenceLevel => { Writable => 'integer' },
1694             );
1695              
1696             # Getty Images namespace (ref PH)
1697             %Image::ExifTool::XMP::GettyImages = (
1698             %xmpTableDefaults,
1699             GROUPS => { 1 => 'XMP-getty', 2 => 'Image' },
1700             NAMESPACE => 'GettyImagesGIFT',
1701             NOTES => q{
1702             The actual Getty Images namespace prefix is "GettyImagesGIFT", which is the
1703             prefix recorded in the file, but ExifTool shortens this for the family 1
1704             group name.
1705             },
1706             Personality => { List => 'Bag' },
1707             OriginalFilename => { Name => 'OriginalFileName' },
1708             ParentMEID => { },
1709             # the following from StarGeek
1710             AssetID => { },
1711             CallForImage => { },
1712             CameraFilename => { },
1713             CameraMakeModel => { Avoid => 1 },
1714             Composition => { },
1715             CameraSerialNumber => { Avoid => 1 },
1716             ExclusiveCoverage => { },
1717             GIFTFtpPriority => { },
1718             ImageRank => { },
1719             MediaEventIdDate => { },
1720             OriginalCreateDateTime => { %dateTimeInfo, Groups => { 2 => 'Time' }, Avoid => 1 },
1721             ParentMediaEventID => { },
1722             PrimaryFTP => { List => 'Bag' },
1723             RoutingDestinations => { List => 'Bag' },
1724             RoutingExclusions => { List => 'Bag' },
1725             SecondaryFTP => { List => 'Bag' },
1726             TimeShot => { },
1727             );
1728              
1729             # RED smartphone images (ref PH)
1730             %Image::ExifTool::XMP::LImage = (
1731             %xmpTableDefaults,
1732             GROUPS => { 1 => 'XMP-LImage', 2 => 'Image' },
1733             NAMESPACE => 'LImage',
1734             NOTES => 'Tags written by RED smartphones.',
1735             MajorVersion => { },
1736             MinorVersion => { },
1737             RightAlbedo => {
1738             Notes => 'Right stereoscopic image',
1739             Groups => { 2 => 'Preview' },
1740             ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
1741             ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)',
1742             },
1743             );
1744              
1745             # hdr metadata namespace used by ACR 15.1
1746             %Image::ExifTool::XMP::hdr = (
1747             %xmpTableDefaults,
1748             GROUPS => { 1 => 'XMP-hdr', 2 => 'Image' },
1749             NAMESPACE => 'hdr_metadata',
1750             TABLE_DESC => 'XMP HDR Metadata',
1751             NOTES => q{
1752             HDR metadata namespace tags written by ACR 15.1. The actual namespace
1753             prefix is "hdr_metadata", which is the prefix recorded in the file, but
1754             ExifTool shortens this for the family 1 group name.
1755             },
1756             ccv_primaries_xy => { Name => 'CCVPrimariesXY' }, # (comma-separated string of 6 reals)
1757             ccv_white_xy => { Name => 'CCVWhiteXY' }, # (comma-separated string of 2 reals)
1758             ccv_min_luminance_nits => { Name => 'CCVMinLuminanceNits', Writable => 'real' },
1759             ccv_max_luminance_nits => { Name => 'CCVMaxLuminanceNits', Writable => 'real' },
1760             ccv_avg_luminance_nits => { Name => 'CCVAvgLuminanceNits', Writable => 'real' },
1761             scene_referred => { Name => 'SceneReferred', Writable => 'boolean' },
1762             );
1763              
1764             # HDR Gain Map metadata namespace
1765             %Image::ExifTool::XMP::hdrgm = (
1766             %xmpTableDefaults,
1767             GROUPS => { 1 => 'XMP-hdrgm', 2 => 'Image' },
1768             NAMESPACE => 'hdrgm',
1769             TABLE_DESC => 'XMP HDR Gain Map Metadata',
1770             NOTES => 'Tags used in Adobe gain map images.',
1771             Version => { Avoid => 1 },
1772             BaseRenditionIsHDR => { Writable => 'boolean' },
1773             # this is a pain in the ass: List items below may or may not be lists
1774             # according to the Adobe specification -- I don't know how to handle tags
1775             # with a variable format like this, so just make them lists here for now
1776             OffsetSDR => { Writable => 'real', List => 'Seq' },
1777             OffsetHDR => { Writable => 'real', List => 'Seq' },
1778             HDRCapacityMin => { Writable => 'real' },
1779             HDRCapacityMax => { Writable => 'real' },
1780             GainMapMin => { Writable => 'real', List => 'Seq' },
1781             GainMapMax => { Writable => 'real', List => 'Seq' },
1782             Gamma => { Writable => 'real', List => 'Seq', Avoid => 1 },
1783             );
1784              
1785             %Image::ExifTool::XMP::HDRGainMap = (
1786             %xmpTableDefaults,
1787             GROUPS => { 1 => 'XMP-HDRGainMap', 2 => 'Unknown' },
1788             NAMESPACE => 'HDRGainMap',
1789             NOTES => 'Used in Apple HDR GainMap images.',
1790             HDRGainMapVersion => {
1791             PrintConv => 'IsInt($val) ? join(".",unpack("C*", pack "N", $val)) : $val',
1792             PrintConvInv => q{
1793             return $val unless $val =~ /^\d+\.\d+\.\d+\.\d+$/;
1794             return unpack('N', pack('C*', split /\./, $val));
1795             },
1796             },
1797             );
1798              
1799             %Image::ExifTool::XMP::apdi = (
1800             %xmpTableDefaults,
1801             GROUPS => { 1 => 'XMP-apdi', 2 => 'Image' },
1802             NAMESPACE => 'apdi',
1803             NOTES => 'Used in Apple HDR GainMap images.',
1804             NativeFormat => {
1805             PrintConv => q{
1806             return $val unless IsInt($val);
1807             my $tmp = pack("N", $val);
1808             $tmp =~ /^\w{4}$/ ? $tmp : $val;
1809             },
1810             PrintConvInv => '$val =~ /^\w{4}$/ ? unpack("N", $val) : $val',
1811             },
1812             AuxiliaryImageType => { },
1813             StoredFormat => {
1814             PrintConv => q{
1815             return $val unless IsInt($val);
1816             my $tmp = pack("N", $val);
1817             $tmp =~ /^\w{4}$/ ? $tmp : $val;
1818             },
1819             PrintConvInv => '$val =~ /^\w{4}$/ ? unpack("N", $val) : $val',
1820             },
1821             );
1822              
1823             # SVG namespace properties (ref 9)
1824             %Image::ExifTool::XMP::SVG = (
1825             GROUPS => { 0 => 'SVG', 1 => 'SVG', 2 => 'Image' },
1826             NAMESPACE => 'svg',
1827             LANG_INFO => \&GetLangInfo,
1828             NOTES => q{
1829             SVG (Scalable Vector Graphics) image tags. By default, only the top-level
1830             SVG and Metadata tags are extracted from these images, but all graphics tags
1831             may be extracted by setting the Unknown option to 2 (-U on the command
1832             line). The SVG tags are not part of XMP as such, but are included with the
1833             XMP module for convenience. (see L)
1834             },
1835             version => 'SVGVersion',
1836             id => 'ID',
1837             metadataId => 'MetadataID',
1838             width => {
1839             Name => 'ImageWidth',
1840             ValueConv => '$val =~ s/px$//; $val',
1841             },
1842             height => {
1843             Name => 'ImageHeight',
1844             ValueConv => '$val =~ s/px$//; $val',
1845             },
1846             );
1847              
1848             # table to add tags in other namespaces
1849             %Image::ExifTool::XMP::otherSVG = (
1850             GROUPS => { 0 => 'SVG', 2 => 'Unknown' },
1851             LANG_INFO => \&GetLangInfo,
1852             NAMESPACE => undef, # variable namespace
1853             'c2pa:manifest' => {
1854             Name => 'JUMBF',
1855             Groups => { 0 => 'JUMBF' },
1856             RawConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
1857             SubDirectory => {
1858             TagTable => 'Image::ExifTool::Jpeg2000::Main',
1859             ByteOrder => 'BigEndian',
1860             },
1861             },
1862             );
1863              
1864             %Image::ExifTool::XMP::seal = (
1865             GROUPS => { 0 => 'XMP', 1 => 'XMP-seal', 2 => 'Image' },
1866             NAMESPACE => 'seal',
1867             WRITABLE => 'string',
1868             NOTES => 'SEAL embedded in XMP.',
1869             seal => {
1870             Name => 'Seal',
1871             Binary => 1,
1872             SubDirectory => { TagTable => 'Image::ExifTool::XMP::SEAL' },
1873             },
1874             );
1875              
1876             %Image::ExifTool::XMP::SEAL = (
1877             GROUPS => { 0 => 'XML', 1 => 'SEAL', 2 => 'Document' },
1878             PROCESS_PROC => \&ProcessSEAL,
1879             NOTES => q{
1880             These tags are used in SEAL (Secure Evidence Attribution Label) content
1881             authentification, which is actually XML format, not XMP. ExifTool has
1882             read/delete support for SEAL information in JPG, TIFF, XMP, PNG, WEBP, HEIC,
1883             PPM, MOV and MP4 files, and read-only support in PDF, MKV and WAV. Use
1884             C<-seal:all=> on the command line to delete SEAL information in supported
1885             formats. See L for the specification.
1886             },
1887             seal=> 'SEALVersion',
1888             ka => 'KeyAlgorithm',
1889             kv => 'KeyVersion',
1890             da => 'DigestAlgorithm',
1891             b => 'ByteRange',
1892             d => 'Domain',
1893             uid => 'UniqueIdentifier',
1894             id => 'Identifier',
1895             sf => 'SignatureFormat',
1896             sl => 'SignatureLength',
1897             's' => 'Signature',
1898             info=> 'SEALComment',
1899             copyright => { Name => 'Copyright', Groups => { 2 => 'Author' } },
1900             );
1901              
1902             #------------------------------------------------------------------------------
1903             # We found a SEAL property name/value
1904             # Inputs: 0) ExifTool ref, 1) tag table ref, 2) xmp property list ref
1905             # 3) property value, 4) attribute hash ref
1906             # Returns: 1 if valid tag was found
1907             sub FoundSEAL($$$$;$)
1908             {
1909 0     0 0 0 my ($et, $tagTablePtr, $props, $val, $attrs) = @_;
1910             # remove 'seal' container property from name
1911 0         0 my @sealProps = @$props;
1912 0 0 0     0 shift @sealProps if @sealProps and $sealProps[0] eq 'seal';
1913 0         0 return FoundXMP($et, $tagTablePtr, \@sealProps, $val, $attrs);
1914             }
1915              
1916             #------------------------------------------------------------------------------
1917             # Process SEAL XML
1918             # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
1919             # Returns: 1 on success
1920             sub ProcessSEAL($$;$)
1921             {
1922 0     0 0 0 my ($et, $dirInfo, $tagTablePtr) = @_;
1923 0         0 $$dirInfo{XMPParseOpts}{FoundProc} = \&FoundSEAL;
1924 0         0 return ProcessXMP($et, $dirInfo, $tagTablePtr);
1925             }
1926              
1927             #------------------------------------------------------------------------------
1928             # Generate crd tags
1929             # Inputs: 0) tag table ref
1930             sub Init_crd($)
1931             {
1932 13     13 0 39 my $tagTablePtr = shift;
1933             # import tags from CRS namespace
1934 13         80 my $crsTable = GetTagTable('Image::ExifTool::XMP::crs');
1935 13         40 my $tag;
1936 13         78 foreach $tag (Image::ExifTool::TagTableKeys($crsTable)) {
1937 3484         4842 my $crsInfo = $$crsTable{$tag};
1938 3484         15427 my $tagInfo = $$tagTablePtr{$tag} = { %$crsInfo };
1939 3484 50       7515 $$tagInfo{Groups} = { 0 => 'XMP', 1 => 'XMP-crd' , 2 => $$crsInfo{Groups}{2} } if $$crsInfo{Groups};
1940             }
1941             }
1942              
1943             1; #end
1944              
1945             __END__