tikiwiki/packages/tiki-pkg-mediaalchemyst/phpexiftool/exiftool/lib/Image/ExifTool/XMP2.pl
2023-11-20 20:52:04 +00:00

1583 lines
55 KiB
Perl
Executable File

#------------------------------------------------------------------------------
# File: XMP2.pl
#
# Description: Additional XMP namespace definitions
#
# Revisions: 10/12/2008 - P. Harvey Created
#
# References: 1) PLUS - http://ns.useplus.org/
# 2) PRISM - http://www.prismstandard.org/
# 3) http://www.portfoliofaq.com/pfaq/v7mappings.htm
# 5) http://creativecommons.org/technology/xmp
# --> changed to http://wiki.creativecommons.org/Companion_File_metadata_specification (2007/12/21)
# 6) http://www.optimasc.com/products/fileid/xmp-extensions.pdf
# 9) http://www.w3.org/TR/SVG11/
# 11) http://www.extensis.com/en/support/kb_article.jsp?articleNumber=6102211
# 12) XMPSpecificationPart3_May2013, page 58
#------------------------------------------------------------------------------
package Image::ExifTool::XMP;
use strict;
use Image::ExifTool qw(:Utils);
use Image::ExifTool::XMP;
# xmpDM structure definitions
my %sCuePointParam = (
STRUCT_NAME => 'CuePointParam',
NAMESPACE => 'xmpDM',
key => { },
value => { },
);
my %sMarker = (
STRUCT_NAME => 'Marker',
NAMESPACE => 'xmpDM',
comment => { },
duration => { },
location => { },
name => { },
startTime => { },
target => { },
type => { },
# added Oct 2008
cuePointParams => { Struct => \%sCuePointParam, List => 'Seq' },
cuePointType=> { },
probability => { Writable => 'real' },
speaker => { },
);
my %sTime = (
STRUCT_NAME => 'Time',
NAMESPACE => 'xmpDM',
scale => { Writable => 'rational' },
value => { Writable => 'integer' },
);
my %sTimecode = (
STRUCT_NAME => 'Timecode',
NAMESPACE => 'xmpDM',
timeFormat => {
PrintConv => {
'24Timecode' => '24 fps',
'25Timecode' => '25 fps',
'2997DropTimecode' => '29.97 fps (drop)',
'2997NonDropTimecode' => '29.97 fps (non-drop)',
'30Timecode' => '30 fps',
'50Timecode' => '50 fps',
'5994DropTimecode' => '59.94 fps (drop)',
'5994NonDropTimecode' => '59.94 fps (non-drop)',
'60Timecode' => '60 fps',
'23976Timecode' => '23.976 fps',
},
},
timeValue => { },
value => { Writable => 'integer' },
);
# XMP Dynamic Media namespace properties (xmpDM)
%Image::ExifTool::XMP::xmpDM = (
%xmpTableDefaults,
GROUPS => { 1 => 'XMP-xmpDM', 2 => 'Image' },
NAMESPACE => 'xmpDM',
NOTES => 'XMP Dynamic Media namespace tags.',
absPeakAudioFilePath=> { },
album => { },
altTapeName => { },
altTimecode => { Struct => \%sTimecode },
artist => { Avoid => 1, Groups => { 2 => 'Author' } },
audioModDate => { Groups => { 2 => 'Time' }, %dateTimeInfo },
audioSampleRate => { Writable => 'integer' },
audioSampleType => {
PrintConv => {
'8Int' => '8-bit integer',
'16Int' => '16-bit integer',
'24Int' => '24-bit integer',
'32Int' => '32-bit integer',
'32Float' => '32-bit float',
'Compressed' => 'Compressed',
'Packed' => 'Packed',
'Other' => 'Other',
},
},
audioChannelType => {
PrintConv => {
'Mono' => 'Mono',
'Stereo' => 'Stereo',
'5.1' => '5.1',
'7.1' => '7.1',
'16 Channel' => '16 Channel',
'Other' => 'Other',
},
},
audioCompressor => { },
beatSpliceParams => {
Struct => {
STRUCT_NAME => 'BeatSpliceStretch',
NAMESPACE => 'xmpDM',
riseInDecibel => { Writable => 'real' },
riseInTimeDuration => { Struct => \%sTime },
useFileBeatsMarker => { Writable => 'boolean' },
},
},
cameraAngle => { },
cameraLabel => { },
cameraModel => { },
cameraMove => { },
client => { },
comment => { Name => 'DMComment' },
composer => { Groups => { 2 => 'Author' } },
contributedMedia => {
Struct => {
STRUCT_NAME => 'Media',
NAMESPACE => 'xmpDM',
duration => { Struct => \%sTime },
managed => { Writable => 'boolean' },
path => { },
startTime => { Struct => \%sTime },
track => { },
webStatement=> { },
},
List => 'Bag',
},
copyright => { Avoid => 1, Groups => { 2 => 'Author' } }, # (deprecated)
director => { },
directorPhotography => { },
discNumber => { }, #12
duration => { Struct => \%sTime },
engineer => { },
fileDataRate => { Writable => 'rational' },
genre => { },
good => { Writable => 'boolean' },
instrument => { },
introTime => { Struct => \%sTime },
key => {
PrintConvColumns => 3,
PrintConv => {
'C' => 'C', 'C#' => 'C#', 'D' => 'D', 'D#' => 'D#',
'E' => 'E', 'F' => 'F', 'F#' => 'F#', 'G' => 'G',
'G#' => 'G#', 'A' => 'A', 'A#' => 'A#', 'B' => 'B',
},
},
logComment => { },
loop => { Writable => 'boolean' },
lyrics => { }, #12
numberOfBeats => { Writable => 'real' },
markers => { Struct => \%sMarker, List => 'Seq' },
metadataModDate => { Groups => { 2 => 'Time' }, %dateTimeInfo },
outCue => { Struct => \%sTime },
partOfCompilation=>{ Writable => 'boolean' }, #12
projectName => { },
projectRef => {
Struct => {
STRUCT_NAME => 'ProjectLink',
NAMESPACE => 'xmpDM',
path => { },
type => {
PrintConv => {
movie => 'Movie',
still => 'Still Image',
audio => 'Audio',
custom => 'Custom',
},
},
},
},
pullDown => {
PrintConvColumns => 2,
PrintConv => {
'WSSWW' => 'WSSWW', 'SSWWW' => 'SSWWW',
'SWWWS' => 'SWWWS', 'WWWSS' => 'WWWSS',
'WWSSW' => 'WWSSW', 'WWWSW' => 'WWWSW',
'WWSWW' => 'WWSWW', 'WSWWW' => 'WSWWW',
'SWWWW' => 'SWWWW', 'WWWWS' => 'WWWWS',
},
},
relativePeakAudioFilePath => { },
relativeTimestamp => { Struct => \%sTime },
releaseDate => { Groups => { 2 => 'Time' }, %dateTimeInfo },
resampleParams => {
Struct => {
STRUCT_NAME => 'ResampleStretch',
NAMESPACE => 'xmpDM',
quality => { PrintConv => { Low => 'Low', Medium => 'Medium', High => 'High' } },
},
},
scaleType => {
PrintConv => {
Major => 'Major',
Minor => 'Minor',
Both => 'Both',
Neither => 'Neither',
},
},
scene => { Avoid => 1 },
shotDate => { Groups => { 2 => 'Time' }, %dateTimeInfo },
shotDay => { },
shotLocation => { },
shotName => { },
shotNumber => { },
shotSize => { },
speakerPlacement=> { },
startTimecode => { Struct => \%sTimecode },
startTimeSampleSize => { Writable => 'integer' }, #PH
startTimeScale => { }, #PH (real?)
stretchMode => {
PrintConv => {
'Fixed length' => 'Fixed length',
'Time-Scale' => 'Time-Scale',
'Resample' => 'Resample',
'Beat Splice' => 'Beat Splice',
'Hybrid' => 'Hybrid',
},
},
takeNumber => { Writable => 'integer' },
tapeName => { },
tempo => { Writable => 'real' },
timeScaleParams => {
Struct => {
STRUCT_NAME => 'TimeScaleStretch',
NAMESPACE => 'xmpDM',
frameOverlappingPercentage => { Writable => 'real' },
frameSize => { Writable => 'real' },
quality => { PrintConv => { Low => 'Low', Medium => 'Medium', High => 'High' } },
},
},
timeSignature => {
PrintConvColumns => 3,
PrintConv => {
'2/4' => '2/4', '3/4' => '3/4', '4/4' => '4/4',
'5/4' => '5/4', '7/4' => '7/4', '6/8' => '6/8',
'9/8' => '9/8', '12/8'=> '12/8', 'other' => 'other',
},
},
trackNumber => { Writable => 'integer' },
Tracks => {
Struct => {
STRUCT_NAME => 'Track',
NAMESPACE => 'xmpDM',
frameRate => { },
markers => { Struct => \%sMarker, List => 'Seq' },
trackName => { },
trackType => { },
},
List => 'Bag',
},
videoAlphaMode => {
PrintConv => {
'straight' => 'Straight',
'pre-multiplied', => 'Pre-multiplied',
'none' => 'None',
},
},
videoAlphaPremultipleColor => { Struct => \%sColorant },
videoAlphaUnityIsTransparent => { Writable => 'boolean' },
videoColorSpace => {
PrintConv => {
'sRGB' => 'sRGB',
'CCIR-601' => 'CCIR-601',
'CCIR-709' => 'CCIR-709',
},
},
videoCompressor => { },
videoFieldOrder => {
PrintConv => {
Upper => 'Upper',
Lower => 'Lower',
Progressive => 'Progressive',
},
},
videoFrameRate => { Writable => 'real' },
videoFrameSize => { Struct => \%sDimensions },
videoModDate => { Groups => { 2 => 'Time' }, %dateTimeInfo },
videoPixelAspectRatio => { Writable => 'rational' },
videoPixelDepth => {
PrintConv => {
'8Int' => '8-bit integer',
'16Int' => '16-bit integer',
'24Int' => '24-bit integer',
'32Int' => '32-bit integer',
'32Float' => '32-bit float',
'Other' => 'Other',
},
},
);
#------------------------------------------------------------------------------
# PLUS (Picture Licensing Universal System)
# PLUS vocabulary conversions
my %plusVocab = (
ValueConv => '$val =~ s{http://ns.useplus.org/ldf/vocab/}{}; $val',
ValueConvInv => '"http://ns.useplus.org/ldf/vocab/$val"',
);
# PLUS License Data Format 1.2.1 structures
# (this seems crazy to me -- why did they define different ID/Name structures
# for each field rather than just re-using the same structure?)
my %plusLicensee = (
STRUCT_NAME => 'Licensee',
NAMESPACE => 'plus',
# all "rdf:type" properties removed in version 1.2.1
# (idiots. Why did they put them there in the first place? -- it required
# a special patch for ExifTool to support these, and now they are gone!)
# TYPE => 'plus:LicenseeDetail', (removed in 1.2.1)
LicenseeID => { },
LicenseeName=> { },
);
my %plusEndUser = (
STRUCT_NAME => 'EndUser',
NAMESPACE => 'plus',
# TYPE => 'plus:EndUserDetail', (removed in 1.2.1)
EndUserID => { },
EndUserName => { },
);
my %plusLicensor = (
STRUCT_NAME => 'Licensor',
NAMESPACE => 'plus',
# TYPE => 'plus:LicensorDetail', (removed in 1.2.1)
LicensorID => { },
LicensorName => { },
LicensorStreetAddress => { },
LicensorExtendedAddress => { },
LicensorCity => { },
LicensorRegion => { },
LicensorPostalCode => { },
LicensorCountry => { },
LicensorTelephoneType1 => {
%plusVocab,
PrintConv => {
'work' => 'Work',
'cell' => 'Cell',
'fax' => 'FAX',
'home' => 'Home',
'pager' => 'Pager',
},
},
LicensorTelephone1 => { },
LicensorTelephoneType2 => {
%plusVocab,
PrintConv => {
'work' => 'Work',
'cell' => 'Cell',
'fax' => 'FAX',
'home' => 'Home',
'pager' => 'Pager',
},
},
LicensorTelephone2 => { },
LicensorEmail => { },
LicensorURL => { },
);
my %plusCopyrightOwner = (
STRUCT_NAME => 'CopyrightOwner',
NAMESPACE => 'plus',
# TYPE => 'plus:CopyrightOwnerDetail', (removed in 1.2.1)
CopyrightOwnerID => { },
CopyrightOwnerName => { },
);
my %plusImageCreator = (
STRUCT_NAME => 'ImageCreator',
NAMESPACE => 'plus',
# TYPE => 'plus:ImageCreatorDetail', (removed in 1.2.1)
ImageCreatorID => { },
ImageCreatorName => { },
);
my %plusImageSupplier = (
STRUCT_NAME => 'ImageSupplier',
NAMESPACE => 'plus',
# TYPE => 'plus:ImageSupplierDetail', (removed in 1.2.1)
ImageSupplierID => { },
ImageSupplierName => { },
);
# PLUS License Data Format 1.2.0 (plus) (ref 1)
%Image::ExifTool::XMP::plus = (
%xmpTableDefaults,
GROUPS => { 0 => 'XMP', 1 => 'XMP-plus', 2 => 'Author' },
NAMESPACE => 'plus',
NOTES => q{
PLUS License Data Format 1.2.1 namespace tags. Note that all
controlled-vocabulary tags in this table (ie. tags with a fixed set of
values) have raw values which begin with "http://ns.useplus.org/ldf/vocab/",
but to reduce clutter this prefix has been removed from the values shown
below. (see L<http://ns.useplus.org/>)
},
Version => { Name => 'PLUSVersion' },
Licensee => {
FlatName => '',
Struct => \%plusLicensee,
List => 'Seq',
},
EndUser => {
FlatName => '',
Struct => \%plusEndUser,
List => 'Seq',
},
Licensor => {
FlatName => '',
Struct => \%plusLicensor,
List => 'Seq',
},
LicensorNotes => { Writable => 'lang-alt' },
MediaSummaryCode => { },
LicenseStartDate => { %dateTimeInfo, Groups => { 2 => 'Time'} },
LicenseEndDate => { %dateTimeInfo, Groups => { 2 => 'Time'} },
MediaConstraints => { Writable => 'lang-alt' },
RegionConstraints => { Writable => 'lang-alt' },
ProductOrServiceConstraints => { Writable => 'lang-alt' },
ImageFileConstraints => {
List => 'Bag',
%plusVocab,
PrintConv => {
'IF-MFN' => 'Maintain File Name',
'IF-MID' => 'Maintain ID in File Name',
'IF-MMD' => 'Maintain Metadata',
'IF-MFT' => 'Maintain File Type',
},
},
ImageAlterationConstraints => {
List => 'Bag',
%plusVocab,
PrintConv => {
'AL-CRP' => 'No Cropping',
'AL-FLP' => 'No Flipping',
'AL-RET' => 'No Retouching',
'AL-CLR' => 'No Colorization',
'AL-DCL' => 'No De-Colorization',
'AL-MRG' => 'No Merging',
},
},
ImageDuplicationConstraints => {
%plusVocab,
PrintConv => {
'DP-NDC' => 'No Duplication Constraints',
'DP-LIC' => 'Duplication Only as Necessary Under License',
'DP-NOD' => 'No Duplication',
},
},
ModelReleaseStatus => {
%plusVocab,
PrintConv => {
'MR-NON' => 'None',
'MR-NAP' => 'Not Applicable',
'MR-UMR' => 'Unlimited Model Releases',
'MR-LMR' => 'Limited or Incomplete Model Releases',
},
},
ModelReleaseID => { List => 'Bag' },
MinorModelAgeDisclosure => {
%plusVocab,
PrintConv => {
'AG-UNK' => 'Age Unknown',
'AG-A25' => 'Age 25 or Over',
'AG-A24' => 'Age 24',
'AG-A23' => 'Age 23',
'AG-A22' => 'Age 22',
'AG-A21' => 'Age 21',
'AG-A20' => 'Age 20',
'AG-A19' => 'Age 19',
'AG-A18' => 'Age 18',
'AG-A17' => 'Age 17',
'AG-A16' => 'Age 16',
'AG-A15' => 'Age 15',
'AG-U14' => 'Age 14 or Under',
},
},
PropertyReleaseStatus => {
%plusVocab,
PrintConv => {
'PR-NON' => 'None',
'PR-NAP' => 'Not Applicable',
'PR-UPR' => 'Unlimited Property Releases',
'PR-LPR' => 'Limited or Incomplete Property Releases',
},
},
PropertyReleaseID => { List => 'Bag' },
OtherConstraints => { Writable => 'lang-alt' },
CreditLineRequired => {
%plusVocab,
PrintConv => {
'CR-NRQ' => 'Not Required',
'CR-COI' => 'Credit on Image',
'CR-CAI' => 'Credit Adjacent To Image',
'CR-CCA' => 'Credit in Credits Area',
},
},
AdultContentWarning => {
%plusVocab,
PrintConv => {
'CW-NRQ' => 'Not Required',
'CW-AWR' => 'Adult Content Warning Required',
'CW-UNK' => 'Unknown',
},
},
OtherLicenseRequirements => { Writable => 'lang-alt' },
TermsAndConditionsText => { Writable => 'lang-alt' },
TermsAndConditionsURL => { },
OtherConditions => { Writable => 'lang-alt' },
ImageType => {
%plusVocab,
PrintConv => {
'TY-PHO' => 'Photographic Image',
'TY-ILL' => 'Illustrated Image',
'TY-MCI' => 'Multimedia or Composited Image',
'TY-VID' => 'Video',
'TY-OTR' => 'Other',
},
},
LicensorImageID => { },
FileNameAsDelivered => { },
ImageFileFormatAsDelivered => {
%plusVocab,
PrintConv => {
'FF-JPG' => 'JPEG Interchange Formats (JPG, JIF, JFIF)',
'FF-TIF' => 'Tagged Image File Format (TIFF)',
'FF-GIF' => 'Graphics Interchange Format (GIF)',
'FF-RAW' => 'Proprietary RAW Image Format',
'FF-DNG' => 'Digital Negative (DNG)',
'FF-EPS' => 'Encapsulated PostScript (EPS)',
'FF-BMP' => 'Windows Bitmap (BMP)',
'FF-PSD' => 'Photoshop Document (PSD)',
'FF-PIC' => 'Macintosh Picture (PICT)',
'FF-PNG' => 'Portable Network Graphics (PNG)',
'FF-WMP' => 'Windows Media Photo (HD Photo)',
'FF-OTR' => 'Other',
},
},
ImageFileSizeAsDelivered => {
%plusVocab,
PrintConv => {
'SZ-U01' => 'Up to 1 MB',
'SZ-U10' => 'Up to 10 MB',
'SZ-U30' => 'Up to 30 MB',
'SZ-U50' => 'Up to 50 MB',
'SZ-G50' => 'Greater than 50 MB',
},
},
CopyrightStatus => {
%plusVocab,
PrintConv => {
'CS-PRO' => 'Protected',
'CS-PUB' => 'Public Domain',
'CS-UNK' => 'Unknown',
},
},
CopyrightRegistrationNumber => { },
FirstPublicationDate => { %dateTimeInfo, Groups => { 2 => 'Time'} },
CopyrightOwner => {
FlatName => '',
Struct => \%plusCopyrightOwner,
List => 'Seq',
},
CopyrightOwnerImageID => { },
ImageCreator => {
FlatName => '',
Struct => \%plusImageCreator,
List => 'Seq',
},
ImageCreatorImageID => { },
ImageSupplier => {
FlatName => '',
Struct => \%plusImageSupplier,
List => 'Seq',
},
ImageSupplierImageID => { },
LicenseeImageID => { },
LicenseeImageNotes => { Writable => 'lang-alt' },
OtherImageInfo => { Writable => 'lang-alt' },
LicenseID => { },
LicensorTransactionID => { List => 'Bag' },
LicenseeTransactionID => { List => 'Bag' },
LicenseeProjectReference=> { List => 'Bag' },
LicenseTransactionDate => { %dateTimeInfo, Groups => { 2 => 'Time'} },
Reuse => {
%plusVocab,
PrintConv => {
'RE-REU' => 'Repeat Use',
'RE-NAP' => 'Not Applicable',
},
},
OtherLicenseDocuments => { List => 'Bag' },
OtherLicenseInfo => { Writable => 'lang-alt' },
# Note: these are Bag's of lang-alt lists -- a nested list tag!
Custom1 => { List => 'Bag', Writable => 'lang-alt' },
Custom2 => { List => 'Bag', Writable => 'lang-alt' },
Custom3 => { List => 'Bag', Writable => 'lang-alt' },
Custom4 => { List => 'Bag', Writable => 'lang-alt' },
Custom5 => { List => 'Bag', Writable => 'lang-alt' },
Custom6 => { List => 'Bag', Writable => 'lang-alt' },
Custom7 => { List => 'Bag', Writable => 'lang-alt' },
Custom8 => { List => 'Bag', Writable => 'lang-alt' },
Custom9 => { List => 'Bag', Writable => 'lang-alt' },
Custom10 => { List => 'Bag', Writable => 'lang-alt' },
);
#------------------------------------------------------------------------------
# PRISM
#
# NOTE: The "Avoid" flag is set for all PRISM tags
# my %obsolete = (
# Notes => 'obsolete in 2.0',
# ValueConvInv => sub {
# my ($val, $self) = @_;
# unless ($self->Options('IgnoreMinorErrors')) {
# warn "Warning: [minor] Attempt to write obsolete tag\n";
# return undef;
# }
# return $val;
# }
# );
# PRISM structure definitions
my %prismPublicationDate = (
STRUCT_NAME => 'prismPublicationDate',
NAMESPACE => 'prism',
date => { %dateTimeInfo, Groups => { 2 => 'Time'} },
'a-platform'=> { },
);
# Publishing Requirements for Industry Standard Metadata (prism) (ref 2)
%Image::ExifTool::XMP::prism = (
%xmpTableDefaults,
GROUPS => { 0 => 'XMP', 1 => 'XMP-prism', 2 => 'Document' },
NAMESPACE => 'prism',
NOTES => q{
Publishing Requirements for Industry Standard Metadata 3.0 namespace
tags. (see L<http://www.prismstandard.org/>)
},
acedemicField => { }, # (3.0)
aggregateIssueNumber => { Writable => 'integer' }, # (3.0)
aggregationType => { List => 'Bag' },
alternateTitle => {
List => 'Bag',
Struct => { # (becomes a structure in 3.0)
STRUCT_NAME => 'prismAlternateTitle',
NAMESPACE => 'prism',
text => { },
'a-platform'=> { },
'a-lang' => { },
},
},
blogTitle => { }, # (3.0)
blogURL => { }, # (3.0)
bookEdition => { }, # (3.0)
byteCount => { Writable => 'integer' },
channel => {
List => 'Bag',
Struct => { # (becomes a structure in 3.0)
STRUCT_NAME => 'prismChannel',
NAMESPACE => 'prism',
channel => { },
subchannel1 => { },
subchannel2 => { },
subchannel3 => { },
subchannel4 => { },
'a-lang' => { },
},
},
complianceProfile=>{ PrintConv => { three => 'Three' } },
contentType => { }, # (3.0)
copyrightYear => { }, # (3.0)
# copyright => { Groups => { 2 => 'Author' } }, # (deprecated in 3.0)
corporateEntity => { List => 'Bag' },
coverDate => { %dateTimeInfo, Groups => { 2 => 'Time'} },
coverDisplayDate=> { },
creationDate => { %dateTimeInfo, Groups => { 2 => 'Time'} },
dateRecieved => { %dateTimeInfo, Groups => { 2 => 'Time'} },
device => { }, # (3.0)
distributor => { },
doi => { Name => 'DOI', Description => 'Digital Object Identifier' },
edition => { },
eIssn => { },
#embargoDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} }, # (deprecated in 3.0)
endingPage => { },
event => { List => 'Bag' },
#expirationDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} }, # (deprecated in 3.0)
genre => { List => 'Bag' },
hasAlternative => { List => 'Bag' },
hasCorrection => {
Struct => { # (becomes a structure in 3.0)
STRUCT_NAME => 'prismHasCorrection',
NAMESPACE => 'prism',
text => { },
'a-platform'=> { },
'a-lang' => { },
},
},
# hasPreviousVersion => { }, # (not in 3.0)
hasTranslation => { List => 'Bag' },
industry => { List => 'Bag' },
isAlternativeOf => { List => 'Bag' }, # (3.0)
isbn => { Name => 'ISBN', List => 'Bag' }, # 2.1 (becomes a list in 3.0)
isCorrectionOf => { List => 'Bag' },
issn => { Name => 'ISSN' },
issueIdentifier => { },
issueName => { },
issueTeaser => { }, # (3.0)
issueType => { }, # (3.0)
isTranslationOf => { },
keyword => { List => 'Bag' },
killDate => {
Struct => { # (becomes a structure in 3.0)
STRUCT_NAME => 'prismKillDate',
NAMESPACE => 'prism',
date => { %dateTimeInfo, Groups => { 2 => 'Time'} },
'a-platform'=> { }, #PH (missed in spec?)
},
},
'link' => { List => 'Bag' }, # (3.0)
location => { List => 'Bag' },
# metadataContainer => { }, (not valid for PRISM XMP)
modificationDate=> { %dateTimeInfo, Groups => { 2 => 'Time'} },
nationalCatalogNumber => { }, # (3.0)
number => { },
object => { List => 'Bag' },
onSaleDate => { # (3.0)
List => 'Bag',
Struct => {
STRUCT_NAME => 'prismOnSaleDate',
NAMESPACE => 'prism',
date => { %dateTimeInfo, Groups => { 2 => 'Time'} },
'a-platform'=> { },
},
},
onSaleDay => { # (3.0)
List => 'Bag',
Struct => {
STRUCT_NAME => 'prismOnSaleDay',
NAMESPACE => 'prism',
day => { }, #PH (not named in spec)
'a-platform'=> { },
},
},
offSaleDate => { # (3.0)
List => 'Bag',
Struct => {
STRUCT_NAME => 'prismOffSaleDate',
NAMESPACE => 'prism',
date => { %dateTimeInfo, Groups => { 2 => 'Time'} },
'a-platform'=> { },
},
},
organization => { List => 'Bag' },
originPlatform => {
List => 'Bag',
PrintConv => {
email => 'E-Mail',
mobile => 'Mobile',
broadcast => 'Broadcast',
web => 'Web',
'print' => 'Print',
recordableMedia => 'Recordable Media',
other => 'Other',
},
},
pageCount => { Writable => 'integer' }, # (3.0)
pageProgressionDirection => { # (3.0)
PrintConv => { LTR => 'Left to Right', RTL => 'Right to Left' },
},
pageRange => { List => 'Bag' },
person => { },
platform => { }, # (3.0)
productCode => { }, # (3.0)
profession => { }, # (3.0)
publicationDate => {
List => 'Bag',
Struct => \%prismPublicationDate, # (becomes a structure in 3.0)
},
publicationDisplayDate => { # (3.0)
List => 'Bag',
Struct => \%prismPublicationDate,
},
publicationName => { },
publishingFrequency => { }, # (3.0)
rating => { },
# rightsAgent => { }, # (deprecated in 3.0)
samplePageRange => { }, # (3.0)
section => { },
sellingAgency => { }, # (3.0)
seriesNumber => { Writable => 'integer' }, # (3.0)
seriesTitle => { }, # (3.0)
sport => { }, # (3.0)
startingPage => { },
subsection1 => { },
subsection2 => { },
subsection3 => { },
subsection4 => { },
subtitle => { }, # (3.0)
supplementDisplayID => { }, # (3.0)
supplementStartingPage => { }, # (3.0)
supplementTitle => { }, # (3.0)
teaser => { List => 'Bag' },
ticker => { List => 'Bag' },
timePeriod => { },
url => {
Name => 'URL',
List => 'Bag',
Struct => { # (becomes a structure in 3.0)
STRUCT_NAME => 'prismUrl',
NAMESPACE => 'prism',
url => { },
'a-platform'=> { },
},
},
uspsNumber => { }, # (3.0)
versionIdentifier => { },
volume => { },
wordCount => { Writable => 'integer' },
# tags that existed in version 1.3
# category => { %obsolete, List => 'Bag' },
# hasFormat => { %obsolete, List => 'Bag' },
# hasPart => { %obsolete, List => 'Bag' },
# isFormatOf => { %obsolete, List => 'Bag' },
# isPartOf => { %obsolete },
# isReferencedBy => { %obsolete, List => 'Bag' },
# isRequiredBy => { %obsolete, List => 'Bag' },
# isVersionOf => { %obsolete },
# objectTitle => { %obsolete, List => 'Bag' },
# receptionDate => { %obsolete },
# references => { %obsolete, List => 'Bag' },
# requires => { %obsolete, List => 'Bag' },
# tags in older versions
# page
# contentLength
# creationTime
# expirationTime
# hasVersion
# isAlternativeFor
# isBasedOn
# isBasisFor
# modificationTime
# publicationTime
# receptionTime
# releaseTime
);
# PRISM Rights Language namespace (prl) (ref 2)
%Image::ExifTool::XMP::prl = (
%xmpTableDefaults,
GROUPS => { 0 => 'XMP', 1 => 'XMP-prl', 2 => 'Document' },
NAMESPACE => 'prl',
NOTES => q{
PRISM Rights Language 2.1 namespace tags. These tags have been deprecated
since the release of the PRISM Usage Rights 3.0. (see
L<http://www.prismstandard.org/>)
},
geography => { List => 'Bag' },
industry => { List => 'Bag' },
usage => { List => 'Bag' },
);
# PRISM Usage Rights namespace (prismusagerights) (ref 2)
%Image::ExifTool::XMP::pur = (
%xmpTableDefaults,
GROUPS => { 0 => 'XMP', 1 => 'XMP-pur', 2 => 'Document' },
NAMESPACE => 'pur',
NOTES => q{
PRISM Usage Rights 3.0 namespace tags. (see
L<http://www.prismstandard.org/>)
},
adultContentWarning => { List => 'Bag' },
agreement => { List => 'Bag' },
copyright => {
# (not clear in 3.0 spec, which lists only "bag Text", and called
# "copyrightDate" instead of "copyright" the PRISM basic 3.0 spec)
Writable => 'lang-alt',
Groups => { 2 => 'Author' },
},
creditLine => { List => 'Bag' },
embargoDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
exclusivityEndDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
expirationDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
imageSizeRestriction=> { },
optionEndDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
permissions => { List => 'Bag' },
restrictions => { List => 'Bag' },
reuseProhibited => { Writable => 'boolean' },
rightsAgent => { },
rightsOwner => { },
# usageFee => { List => 'Bag' }, # (not in 3.0)
);
# PRISM Metadata for Images namespace (pmi) (ref 2)
%Image::ExifTool::XMP::pmi = (
%xmpTableDefaults,
GROUPS => { 0 => 'XMP', 1 => 'XMP-pmi', 2 => 'Image' },
NAMESPACE => 'pmi',
NOTES => q{
PRISM Metadata for Images 3.0 namespace tags. (see
L<http://www.prismstandard.org/>)
},
color => {
PrintConv => {
bw => 'BW',
color => 'Color',
sepia => 'Sepia',
duotone => 'Duotone',
tritone => 'Tritone',
quadtone => 'Quadtone',
},
},
contactInfo => { },
displayName => { },
distributorProductID => { },
eventAlias => { },
eventEnd => { },
eventStart => { },
eventSubtype => { },
eventType => { },
field => { },
framing => { },
location => { },
make => { },
manufacturer => { },
model => { },
modelYear => { },
objectDescription=>{ },
objectSubtype => { },
objectType => { },
orientation => {
PrintConv => {
horizontal => 'Horizontal',
vertical => 'Vertical',
}
},
positionDescriptor => { },
productID => { },
productIDType => { },
season => {
PrintConv => {
spring => 'Spring',
summer => 'Summer',
fall => 'Fall',
winter => 'Winter',
},
},
sequenceName => { },
sequenceNumber => { },
sequenceTotalNumber => { },
setting => { },
shootID => { },
slideshowName => { },
slideshowNumber => { Writable => 'integer' },
slideshowTotalNumber => { Writable => 'integer' },
viewpoint => { },
visualTechnique => { },
);
# PRISM Recipe Metadata (prm) (ref 2)
%Image::ExifTool::XMP::prm = (
%xmpTableDefaults,
GROUPS => { 0 => 'XMP', 1 => 'XMP-prm', 2 => 'Document' },
NAMESPACE => 'prm',
NOTES => q{
PRISM Recipe Metadata 3.0 namespace tags. (see
L<http://www.prismstandard.org/>)
},
cookingEquipment => { },
cookingMethod => { },
course => { },
cuisine => { },
dietaryNeeds => { },
dishType => { },
duration => { },
ingredientExclusion => { },
mainIngredient => { },
meal => { },
recipeEndingPage => { },
recipePageRange => { },
recipeSource => { },
recipeStartingPage => { },
recipeTitle => { },
servingSize => { },
skillLevel => { },
specialOccasion => { },
yield => { },
);
#------------------------------------------------------------------------------
# DICOM namespace properties (DICOM) (ref PH, written by CS3)
%Image::ExifTool::XMP::DICOM = (
%xmpTableDefaults,
GROUPS => { 1 => 'XMP-DICOM', 2 => 'Image' },
NAMESPACE => 'DICOM',
NOTES => q{
DICOM namespace tags. These XMP tags allow some DICOM information to be
stored in files of other than DICOM format. See the
L<DICOM Tags documentation|Image::ExifTool::TagNames/DICOM Tags> for a list
of tags available in DICOM-format files.
},
# change some tag names to correspond with DICOM tags
PatientName => { },
PatientID => { },
PatientSex => { },
PatientDOB => {
Name => 'PatientBirthDate',
Groups => { 2 => 'Time' },
%dateTimeInfo,
},
StudyID => { },
StudyPhysician => { },
StudyDateTime => { Groups => { 2 => 'Time' }, %dateTimeInfo },
StudyDescription => { },
SeriesNumber => { },
SeriesModality => { },
SeriesDateTime => { Groups => { 2 => 'Time' }, %dateTimeInfo },
SeriesDescription => { },
EquipmentInstitution => { },
EquipmentManufacturer => { },
);
# PixelLive namespace properties (PixelLive) (ref 3)
%Image::ExifTool::XMP::PixelLive = (
GROUPS => { 1 => 'XMP-PixelLive', 2 => 'Image' },
NAMESPACE => 'PixelLive',
NOTES => q{
PixelLive namespace tags. These tags are not writable becase they are very
uncommon and I haven't been able to locate a reference which gives the
namespace URI.
},
AUTHOR => { Name => 'Author', Avoid => 1, Groups => { 2 => 'Author' } },
COMMENTS => { Name => 'Comments', Avoid => 1 },
COPYRIGHT => { Name => 'Copyright',Avoid => 1, Groups => { 2 => 'Author' } },
DATE => { Name => 'Date', Avoid => 1, Groups => { 2 => 'Time' } },
GENRE => { Name => 'Genre', Avoid => 1 },
TITLE => { Name => 'Title', Avoid => 1 },
);
# Extensis Portfolio tags (extensis) (ref 11)
%Image::ExifTool::XMP::extensis = (
%xmpTableDefaults,
GROUPS => { 1 => 'XMP-extensis', 2 => 'Image' },
NAMESPACE => 'extensis',
NOTES => 'Tags used by Extensis Portfolio.',
Approved => { Writable => 'boolean' },
ApprovedBy => { },
ClientName => { },
JobName => { },
JobStatus => { },
RoutedTo => { },
RoutingNotes => { },
WorkToDo => { },
);
# IDimager structures (ref PH)
my %sTagStruct;
%sTagStruct = (
STRUCT_NAME => 'TagStructure',
NAMESPACE => 'ics',
LabelName => { },
Reference => { },
ParentReference => { },
SubLabels => { Struct => \%sTagStruct, List => 'Bag' },
);
my %sSubVersion = (
STRUCT_NAME => 'SubVersion',
NAMESPACE => 'ics',
VersRef => { },
FileName => { },
);
# IDimager namespace (ics) (ref PH)
%Image::ExifTool::XMP::ics = (
%xmpTableDefaults,
GROUPS => { 0 => 'XMP', 1 => 'XMP-ics', 2 => 'Image' },
NAMESPACE => 'ics',
NOTES => q{
Tags used by IDimager. Nested TagStructure structures are unrolled to an
arbitrary depth of 6 to avoid infinite recursion.
},
ImageRef => { },
TagStructure => { Struct => \%sTagStruct, List => 'Bag' },
TagStructureLabelName => { Name => 'LabelName1', Flat => 1 },
TagStructureReference => { Name => 'Reference1', Flat => 1 },
TagStructureSubLabels => { Name => 'SubLables1', Flat => 1 },
TagStructureParentReference => { Name => 'ParentReference1', Flat => 1 },
TagStructureSubLabelsLabelName => { Name => 'LabelName2', Flat => 1 },
TagStructureSubLabelsReference => { Name => 'Reference2', Flat => 1 },
TagStructureSubLabelsSubLabels => { Name => 'SubLables2', Flat => 1 },
TagStructureSubLabelsParentReference => { Name => 'ParentReference2', Flat => 1 },
TagStructureSubLabelsSubLabelsLabelName => { Name => 'LabelName3', Flat => 1 },
TagStructureSubLabelsSubLabelsReference => { Name => 'Reference3', Flat => 1 },
TagStructureSubLabelsSubLabelsSubLabels => { Name => 'SubLables3', Flat => 1 },
TagStructureSubLabelsSubLabelsParentReference => { Name => 'ParentReference3', Flat => 1 },
TagStructureSubLabelsSubLabelsSubLabelsLabelName => { Name => 'LabelName4', Flat => 1 },
TagStructureSubLabelsSubLabelsSubLabelsReference => { Name => 'Reference4', Flat => 1 },
TagStructureSubLabelsSubLabelsSubLabelsSubLabels => { Name => 'SubLabels4', Flat => 1 },
TagStructureSubLabelsSubLabelsSubLabelsParentReference => { Name => 'ParentReference4', Flat => 1 },
TagStructureSubLabelsSubLabelsSubLabelsSubLabelsLabelName => { Name => 'LabelName5', Flat => 1 },
TagStructureSubLabelsSubLabelsSubLabelsSubLabelsReference => { Name => 'Reference5', Flat => 1 },
TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabels => { Name => 'SubLabels5', Flat => 1, NoSubStruct => 1 }, # break infinite recursion
TagStructureSubLabelsSubLabelsSubLabelsSubLabelsParentReference => { Name => 'ParentReference5', Flat => 1 },
TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsLabelName => { Name => 'LabelName6', Flat => 1 },
TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsReference => { Name => 'Reference6', Flat => 1 },
TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsParentReference => { Name => 'ParentReference6', Flat => 1 },
SubVersions => { Struct => \%sSubVersion, List => 'Bag' },
SubVersionsVersRef => { Name => 'SubVersionReference', Flat => 1 },
SubVersionsFileName => { Name => 'SubVersionFileName', Flat => 1 },
);
# ACDSee namespace (acdsee) (ref PH)
%Image::ExifTool::XMP::acdsee = (
%xmpTableDefaults,
GROUPS => { 0 => 'XMP', 1 => 'XMP-acdsee', 2 => 'Image' },
NAMESPACE => 'acdsee',
NOTES => q{
ACD Systems ACDSee namespace tags.
(A note to software developers: Re-inventing your own private tags instead
of using the equivalent tags in standard XMP namespaces defeats one of the
most valuable features of metadata: interoperability. Your applications
mumble to themselves instead of speaking out for the rest of the world to
hear.)
},
author => { Avoid => 1, Groups => { 2 => 'Author' } },
caption => { Avoid => 1 },
categories => { Avoid => 1 },
collections=> { Avoid => 1 },
datetime => { Name => 'DateTime', Avoid => 1, Groups => { 2 => 'Time' }, %dateTimeInfo },
keywords => { Avoid => 1, List => 'Bag' },
notes => { Avoid => 1 },
rating => { Avoid => 1, Writable => 'real' }, # integer?
tagged => { Avoid => 1, Writable => 'boolean' },
rawrppused => { Writable => 'boolean' },
rpp => {
Name => 'RPP',
Writable => 'lang-alt',
Notes => 'raw processing settings in XML format',
Binary => 1,
},
dpp => {
Name => 'DPP',
Writable => 'lang-alt',
Notes => 'newer version of XML raw processing settings',
Binary => 1,
},
);
# Picture Licensing Universal System namespace properties (xmpPLUS)
%Image::ExifTool::XMP::xmpPLUS = (
%xmpTableDefaults,
GROUPS => { 1 => 'XMP-xmpPLUS', 2 => 'Author' },
NAMESPACE => 'xmpPLUS',
NOTES => 'XMP Picture Licensing Universal System (PLUS) namespace tags.',
CreditLineReq => { Writable => 'boolean' },
ReuseAllowed => { Writable => 'boolean' },
);
# Creative Commons namespace properties (cc) (ref 5)
%Image::ExifTool::XMP::cc = (
%xmpTableDefaults,
GROUPS => { 1 => 'XMP-cc', 2 => 'Author' },
NAMESPACE => 'cc',
NOTES => q{
Creative Commons namespace tags. Note that the CC specification for XMP is
non-existent, so ExifTool must make some assumptions about the format of the
specific properties in XMP (see L<http://creativecommons.org/ns>).
},
# Work properties
license => { Resource => 1 },
attributionName => { },
attributionURL => { Resource => 1 },
morePermissions => { Resource => 1 },
useGuidelines => { Resource => 1 },
# License properties
permits => {
List => 'Bag',
Resource => 1,
PrintConv => {
'cc:Sharing' => 'Sharing',
'cc:DerivativeWorks' => 'Derivative Works',
'cc:Reproduction' => 'Reproduction',
'cc:Distribution' => 'Distribution',
},
},
requires => {
List => 'Bag',
Resource => 1,
PrintConv => {
'cc:Copyleft' => 'Copyleft',
'cc:LesserCopyleft' => 'Lesser Copyleft',
'cc:SourceCode' => 'Source Code',
'cc:ShareAlike' => 'Share Alike',
'cc:Notice' => 'Notice',
'cc:Attribution' => 'Attribution',
},
},
prohibits => {
List => 'Bag',
Resource => 1,
PrintConv => {
'cc:HighIncomeNationUse' => 'High Income Nation Use',
'cc:CommercialUse' => 'Commercial Use',
},
},
jurisdiction => { Resource => 1 },
legalcode => { Name => 'LegalCode', Resource => 1 },
deprecatedOn => { %dateTimeInfo, Groups => { 2 => 'Time' } },
);
# Description Explorer namespace properties (dex) (ref 6)
%Image::ExifTool::XMP::dex = (
%xmpTableDefaults,
GROUPS => { 1 => 'XMP-dex', 2 => 'Image' },
NAMESPACE => 'dex',
NOTES => q{
Description Explorer namespace tags. These tags are not very common. The
Source and Rating tags are avoided when writing due to name conflicts with
other XMP tags. (see L<http://www.optimasc.com/products/fileid/>)
},
crc32 => { Name => 'CRC32', Writable => 'integer' },
source => { Avoid => 1 },
shortdescription => {
Name => 'ShortDescription',
Writable => 'lang-alt',
},
licensetype => {
Name => 'LicenseType',
PrintConv => {
unknown => 'Unknown',
shareware => 'Shareware',
freeware => 'Freeware',
adware => 'Adware',
demo => 'Demo',
commercial => 'Commercial',
'public domain' => 'Public Domain',
'open source' => 'Open Source',
},
},
revision => { },
rating => { Avoid => 1 },
os => { Name => 'OS', Writable => 'integer' },
ffid => { Name => 'FFID' },
);
# iView MediaPro namespace properties (mediapro) (ref PH)
%Image::ExifTool::XMP::MediaPro = (
%xmpTableDefaults,
GROUPS => { 1 => 'XMP-mediapro', 2 => 'Image' },
NAMESPACE => 'mediapro',
NOTES => 'iView MediaPro namespace tags.',
Event => {
Avoid => 1,
Notes => 'avoided due to conflict with XMP-iptcExt:Event',
},
Location => {
Avoid => 1,
Groups => { 2 => 'Location' },
Notes => 'avoided due to conflict with XMP-iptcCore:Location',
},
Status => { },
People => { List => 'Bag' },
UserFields => { List => 'Bag' },
CatalogSets => { List => 'Bag' },
);
# Microsoft ExpressionMedia namespace properties (expressionmedia)
# (ref http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,4235.0.html)
%Image::ExifTool::XMP::ExpressionMedia = (
%xmpTableDefaults,
GROUPS => { 1 => 'XMP-expressionmedia', 2 => 'Image' },
NAMESPACE => 'expressionmedia',
NOTES => q{
Microsoft Expression Media namespace tags. These tags are avoided when
writing due to name conflicts with tags in other schemas.
},
Event => { Avoid => 1 },
Status => { Avoid => 1 },
People => { Avoid => 1, List => 'Bag' },
CatalogSets => { Avoid => 1, List => 'Bag' },
);
# DigiKam namespace tags (ref PH)
%Image::ExifTool::XMP::digiKam = (
%xmpTableDefaults,
GROUPS => { 1 => 'XMP-digiKam', 2 => 'Image' },
NAMESPACE => 'digiKam',
NOTES => 'DigiKam namespace tags.',
CaptionsAuthorNames => { Writable => 'lang-alt' },
CaptionsDateTimeStamps => { Writable => 'lang-alt', Groups => { 2 => 'Time' } },
TagsList => { List => 'Seq' },
ColorLabel => { },
PickLabel => { },
ImageHistory => { Avoid => 1, Notes => 'different format from EXIF:ImageHistory' },
LensCorrectionSettings => { },
);
# SWF namespace tags (ref PH)
%Image::ExifTool::XMP::swf = (
%xmpTableDefaults,
GROUPS => { 1 => 'XMP-swf', 2 => 'Image' },
NAMESPACE => 'swf',
NOTES => 'Adobe SWF namespace tags.',
type => { Avoid => 1 },
bgalpha => { Name => 'BackgroundAlpha', Writable => 'integer' },
forwardlock => { Name => 'ForwardLock', Writable => 'boolean' },
maxstorage => { Name => 'MaxStorage', Writable => 'integer' }, # (CS5)
);
# Sony Ericsson cell phone location tags
# refs: http://www.opencellid.org/api
# http://zonetag.research.yahoo.com/faq_location.php
# http://www.cs.columbia.edu/sip/drafts/LIF%20TS%20101%20v2.0.0.pdf
%Image::ExifTool::XMP::cell = (
%xmpTableDefaults,
GROUPS => { 1 => 'XMP-cell', 2 => 'Location' },
NAMESPACE => 'cell',
NOTES => 'Location tags written by some Sony Ericsson phones.',
mcc => { Name => 'MobileCountryCode' },
mnc => { Name => 'MobileNetworkCode' },
lac => { Name => 'LocationAreaCode' },
cellid => { Name => 'CellTowerID' },
cgi => { Name => 'CellGlobalID' },
r => { Name => 'CellR' }, # (what is this? Radius?)
);
# Apple adjustment settings (ref PH)
%Image::ExifTool::XMP::aas = (
%xmpTableDefaults,
GROUPS => { 1 => 'XMP-aas', 2 => 'Image' },
NAMESPACE => 'aas',
NOTES => 'Apple Adjustment Settings used by iPhone/iPad.',
CropX => { Writable => 'integer', Avoid => 1 },
CropY => { Writable => 'integer', Avoid => 1 },
CropW => { Writable => 'integer', Avoid => 1 },
CropH => { Writable => 'integer', Avoid => 1 },
AffineA => { Writable => 'real' },
AffineB => { Writable => 'real' },
AffineC => { Writable => 'real' },
AffineD => { Writable => 'real' },
AffineX => { Writable => 'real' },
AffineY => { Writable => 'real' },
Vibrance => { Writable => 'real', Avoid => 1 },
Curve0x => { Writable => 'real' },
Curve0y => { Writable => 'real' },
Curve1x => { Writable => 'real' },
Curve1y => { Writable => 'real' },
Curve2x => { Writable => 'real' },
Curve2y => { Writable => 'real' },
Curve3x => { Writable => 'real' },
Curve3y => { Writable => 'real' },
Curve4x => { Writable => 'real' },
Curve4y => { Writable => 'real' },
Shadows => { Writable => 'real', Avoid => 1 },
Highlights => { Writable => 'real', Avoid => 1 },
);
# Adobe creatorAtom properties (ref PH)
%Image::ExifTool::XMP::creatorAtom = (
%xmpTableDefaults,
GROUPS => { 1 => 'XMP-creatorAtom', 2 => 'Image' },
NAMESPACE => 'creatorAtom',
NOTES => 'Adobe creatorAtom tags, written by After Effects.',
macAtom => {
Struct => {
STRUCT_NAME => 'MacAtom',
NAMESPACE => 'creatorAtom',
applicationCode => { },
invocationAppleEvent => { },
posixProjectPath => { },
},
},
windowsAtom => {
Struct => {
STRUCT_NAME => 'WindowsAtom',
NAMESPACE => 'creatorAtom',
extension => { },
invocationFlags => { },
uncProjectPath => { },
},
},
aeProjectLink => { # (After Effects Project Link)
Struct => {
STRUCT_NAME => 'AEProjectLink',
NAMESPACE => 'creatorAtom',
renderTimeStamp => { Writable => 'integer' },
compositionID => { },
renderQueueItemID => { },
renderOutputModuleIndex => { },
fullPath => { },
},
},
);
# FastPictureViewer namespace properties (http://www.fastpictureviewer.com/help/#rtfcomments)
%Image::ExifTool::XMP::fpv = (
%xmpTableDefaults,
GROUPS => { 1 => 'XMP-fpv', 2 => 'Image' },
NAMESPACE => 'fpv',
NOTES => q{
Fast Picture Viewer tags (see
L<http://www.fastpictureviewer.com/help/#rtfcomments>).
},
RichTextComment => { },
);
# Apple FaceInfo namespace properties (ref PH)
%Image::ExifTool::XMP::apple_fi = (
%xmpTableDefaults,
GROUPS => { 1 => 'XMP-apple-fi', 2 => 'Image' },
NAMESPACE => 'apple-fi',
NOTES => q{
Face information tags written by the Apple iPhone 5 inside the mwg-rs
RegionExtensions.
},
Timestamp => {
Name => 'TimeStamp',
Writable => 'integer',
# (don't know how to convert this)
},
FaceID => { Writable => 'integer' },
AngleInfoRoll => { Writable => 'integer' },
AngleInfoYaw => { Writable => 'integer' },
ConfidenceLevel => { Writable => 'integer' },
);
# Google panorama namespace properties
# (ref http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,4569.0.html)
%Image::ExifTool::XMP::GPano = (
%xmpTableDefaults,
GROUPS => { 1 => 'XMP-GPano', 2 => 'Image' },
NAMESPACE => 'GPano',
NOTES => q{
Panorama tags written by Google Photosphere. See
L<https://developers.google.com/panorama/metadata/> for the specification.
},
UsePanoramaViewer => { Writable => 'boolean' },
CaptureSoftware => { },
StitchingSoftware => { },
ProjectionType => { },
PoseHeadingDegrees => { Writable => 'real' },
PosePitchDegrees => { Writable => 'real' },
PoseRollDegrees => { Writable => 'real' },
InitialViewHeadingDegrees => { Writable => 'integer' },
InitialViewPitchDegrees => { Writable => 'integer' },
InitialViewRollDegrees => { Writable => 'integer' },
InitialHorizontalFOVDegrees => { Writable => 'real' },
FirstPhotoDate => { %dateTimeInfo, Groups => { 2 => 'Time' } },
LastPhotoDate => { %dateTimeInfo, Groups => { 2 => 'Time' } },
SourcePhotosCount => { Writable => 'integer' },
ExposureLockUsed => { Writable => 'boolean' },
CroppedAreaImageWidthPixels => { Writable => 'integer' },
CroppedAreaImageHeightPixels => { Writable => 'integer' },
FullPanoWidthPixels => { Writable => 'integer' },
FullPanoHeightPixels => { Writable => 'integer' },
CroppedAreaLeftPixels => { Writable => 'integer' },
CroppedAreaTopPixels => { Writable => 'integer' },
# (the following have been observed, but are not in the specification)
LargestValidInteriorRectLeft => { Writable => 'integer' },
LargestValidInteriorRectTop => { Writable => 'integer' },
LargestValidInteriorRectWidth => { Writable => 'integer' },
LargestValidInteriorRectHeight => { Writable => 'integer' },
);
# Getty Images namespace (ref PH)
%Image::ExifTool::XMP::GettyImages = (
%xmpTableDefaults,
GROUPS => { 1 => 'XMP-getty', 2 => 'Image' },
NAMESPACE => 'GettyImagesGIFT',
NOTES => q{
The actual Getty Images namespace prefix is "GettyImagesGIFT", which is the
prefix recorded in the file, but ExifTool shortens this for the "XMP-getty"
family 1 group name.
},
Personality => { },
OriginalFilename => { Name => 'OriginalFileName' },
ParentMEID => { },
);
# SVG namespace properties (ref 9)
%Image::ExifTool::XMP::SVG = (
GROUPS => { 0 => 'SVG', 1 => 'SVG', 2 => 'Image' },
NAMESPACE => 'svg',
LANG_INFO => \&GetLangInfo,
NOTES => q{
SVG (Scalable Vector Graphics) image tags. By default, only the top-level
SVG and Metadata tags are extracted from these images, but all graphics tags
may be extracted by setting the Unknown option to 2 (-U on the command
line). The SVG tags are not part of XMP as such, but are included with the
XMP module for convenience. (see L<http://www.w3.org/TR/SVG11/>)
},
version => 'SVGVersion',
id => 'ID',
metadataId => 'MetadataID',
width => {
Name => 'ImageWidth',
ValueConv => '$val =~ s/px$//; $val',
},
height => {
Name => 'ImageHeight',
ValueConv => '$val =~ s/px$//; $val',
},
);
# table to add tags in other namespaces
%Image::ExifTool::XMP::otherSVG = (
GROUPS => { 0 => 'SVG', 2 => 'Unknown' },
LANG_INFO => \&GetLangInfo,
NAMESPACE => undef, # variable namespace
);
# set "Avoid" flag for all PRISM tags
my ($table, $key);
foreach $table (
\%Image::ExifTool::XMP::prism,
\%Image::ExifTool::XMP::prl,
\%Image::ExifTool::XMP::pur,
\%Image::ExifTool::XMP::pmi,
\%Image::ExifTool::XMP::prm)
{
foreach $key (TagTableKeys($table)) {
$$table{$key}{Avoid} = 1;
}
}
1; #end
__END__
=head1 NAME
Image::ExifTool::XMP2.pl - Additional XMP namespace definitions
=head1 SYNOPSIS
This module is loaded automatically by Image::ExifTool when required.
=head1 DESCRIPTION
This file contains definitions for less common XMP namespaces.
=head1 AUTHOR
Copyright 2003-2016, Phil Harvey (phil at owl.phy.queensu.ca)
This library is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=head1 REFERENCES
=over 4
=item L<http://ns.useplus.org/>
=item L<http://www.prismstandard.org/>
=item L<http://www.portfoliofaq.com/pfaq/v7mappings.htm>
=item L<http://creativecommons.org/technology/xmp>
=item L<http://www.optimasc.com/products/fileid/xmp-extensions.pdf>
=item L<http://www.w3.org/TR/SVG11/>
=back
=head1 SEE ALSO
L<Image::ExifTool::TagNames/XMP Tags>,
L<Image::ExifTool(3pm)|Image::ExifTool>
=cut