Ignore:
Timestamp:
2021-02-26T19:39:51+13:00 (3 years ago)
Author:
anupama
Message:

Committing the improvements to EmbeddedMetaPlugin's processing of Keywords vs other metadata fields. Keywords were literally stored as arrays of words rather than phrases in PDFs (at least in Diego's sample PDF), whereas other meta fields like Subjects and Creators stored them as arrays of phrases. To get both to work, Kathy updated EXIF to a newer version, to retrieve the actual EXIF values stored in the PDF. And Kathy and Dr Bainbridge came up with a new option that I added called apply_join_before_split_to_metafields that's a regex which can list the metadata fields to apply the join_before_split to and whcih previously always got applied to all metadata fields. Now it's applied to any *Keywords metafields by default, as that's the metafield we have experience of that behaves differently to the others, as it stores by word instead of phrases. Tested on Diego's sample PDF. Diego has double-checked it to works on his sample PDF too, setting the split char to ; and turning on the join_before_split and leaving apply_join_before_split_to_metafields at its default of .*Keywords. File changes are strings.properties for the tooltip, the plugin introducing the option and working with it and Kathy's EXIF updates affecting cpan/File and cpan/Image.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • main/trunk/greenstone2/perllib/cpan/Image/ExifTool/XMP2.pl

    r24107 r34921  
    22# File:         XMP2.pl
    33#
    4 # Description:  Additional XMP schema definitions
     4# Description:  Additional XMP namespace definitions
    55#
    66# Revisions:    10/12/2008 - P. Harvey Created
     
    99#               2) PRISM - http://www.prismstandard.org/
    1010#               3) http://www.portfoliofaq.com/pfaq/v7mappings.htm
     11#               4) http://www.iptc.org/IPTC4XMP/
    1112#               5) http://creativecommons.org/technology/xmp
    1213#                  --> changed to http://wiki.creativecommons.org/Companion_File_metadata_specification (2007/12/21)
    1314#               6) http://www.optimasc.com/products/fileid/xmp-extensions.pdf
    1415#               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
    1519#------------------------------------------------------------------------------
    1620
     
    2125use Image::ExifTool::XMP;
    2226
    23 # structure definitions
     27sub Init_crd($);
     28
     29#------------------------------------------------------------------------------
     30
     31# xmpDM structure definitions
    2432my %sCuePointParam = (
    2533    STRUCT_NAME => 'CuePointParam',
     
    6876    },
    6977    timeValue   => { },
    70     value       => { Writable => 'integer' },
    71 );
    72 
    73 # XMP Dynamic Media schema properties (xmpDM)
     78    value       => { Writable => 'integer', Notes => 'only in XMP 2008 spec; an error?' },
     79);
     80my %sPose = (
     81    STRUCT_NAME => 'Pose',
     82    NAMESPACE => { Pose => 'http://ns.google.com/photos/dd/1.0/pose/' },
     83    PositionX => { Writable => 'real', Groups => { 2 => 'Location' } },
     84    PositionY => { Writable => 'real', Groups => { 2 => 'Location' } },
     85    PositionZ => { Writable => 'real', Groups => { 2 => 'Location' } },
     86    RotationX => { Writable => 'real', Groups => { 2 => 'Location' } },
     87    RotationY => { Writable => 'real', Groups => { 2 => 'Location' } },
     88    RotationZ => { Writable => 'real', Groups => { 2 => 'Location' } },
     89    RotationW => { Writable => 'real', Groups => { 2 => 'Location' } },
     90    Timestamp => {
     91        Writable => 'integer',
     92        Shift => 'Time',
     93        Groups => { 2 => 'Time' },
     94        ValueConv => 'ConvertUnixTime($val / 1000, 1, 3)',
     95        ValueConvInv => 'int(GetUnixTime($val, 1) * 1000)',
     96        PrintConv => '$self->ConvertDateTime($val)',
     97        PrintConvInv => '$self->InverseDateTime($val,undef,1)',
     98    },
     99);
     100my %sEarthPose = (
     101    STRUCT_NAME => 'EarthPose',
     102    NAMESPACE => { EarthPose => 'http://ns.google.com/photos/dd/1.0/earthpose/' },
     103    Latitude  => { Writable => 'real', Groups => { 2 => 'Location' }, %latConv },
     104    Longitude => { Writable => 'real', Groups => { 2 => 'Location' }, %longConv },
     105    Altitude  => {
     106        Writable => 'real',
     107        Groups => { 2 => 'Location' },
     108        PrintConv => '"$val m"',
     109        PrintConvInv => '$val=~s/\s*m$//;$val',
     110    },
     111    RotationX => { Writable => 'real', Groups => { 2 => 'Location' } },
     112    RotationY => { Writable => 'real', Groups => { 2 => 'Location' } },
     113    RotationZ => { Writable => 'real', Groups => { 2 => 'Location' } },
     114    RotationW => { Writable => 'real', Groups => { 2 => 'Location' } },
     115    Timestamp => {
     116        Writable => 'integer',
     117        Shift => 'Time',
     118        Groups => { 2 => 'Time' },
     119        ValueConv => 'ConvertUnixTime($val / 1000, 1, 3)',
     120        ValueConvInv => 'int(GetUnixTime($val, 1) * 1000)',
     121        PrintConv => '$self->ConvertDateTime($val)',
     122        PrintConvInv => '$self->InverseDateTime($val,undef,1)',
     123    },
     124);
     125my %sVendorInfo = (
     126    STRUCT_NAME => 'VendorInfo',
     127    NAMESPACE   => { VendorInfo => 'http://ns.google.com/photos/dd/1.0/vendorinfo/' },
     128    Model => { },
     129    Manufacturer => { },
     130    Notes => { },
     131);
     132my %sAppInfo = (
     133    STRUCT_NAME => 'AppInfo',
     134    NAMESPACE   => { AppInfo => 'http://ns.google.com/photos/dd/1.0/appinfo/' },
     135    Application => { },
     136    Version => { },
     137    ItemURI => { },
     138);
     139
     140# camera-raw defaults
     141%Image::ExifTool::XMP::crd = (
     142    %xmpTableDefaults,
     143    INIT_TABLE => \&Init_crd,
     144    GROUPS => { 1 => 'XMP-crd', 2 => 'Image' },
     145    NAMESPACE   => 'crd',
     146    AVOID => 1,
     147    TABLE_DESC => 'Photoshop Camera Defaults namespace',
     148    NOTES => 'Adobe Camera Raw Defaults tags.',
     149    # (tags added dynamically when WRITE_PROC is called)
     150);
     151
     152# XMP Dynamic Media namespace properties (xmpDM)
    74153%Image::ExifTool::XMP::xmpDM = (
    75154    %xmpTableDefaults,
    76155    GROUPS => { 1 => 'XMP-xmpDM', 2 => 'Image' },
    77156    NAMESPACE => 'xmpDM',
    78     NOTES => 'XMP Dynamic Media schema tags.',
     157    NOTES => 'XMP Dynamic Media namespace tags.',
    79158    absPeakAudioFilePath=> { },
    80159    album               => { },
     
    139218    director        => { },
    140219    directorPhotography => { },
     220    discNumber      => { }, #12
    141221    duration        => { Struct => \%sTime },
    142222    engineer        => { },
     
    156236    logComment      => { },
    157237    loop            => { Writable => 'boolean' },
     238    lyrics          => { }, #12
    158239    numberOfBeats   => { Writable => 'real' },
    159240    markers         => { Struct => \%sMarker, List => 'Seq' },
    160241    metadataModDate => { Groups => { 2 => 'Time' }, %dateTimeInfo },
    161242    outCue          => { Struct => \%sTime },
     243    partOfCompilation=>{ Writable => 'boolean' }, #12
    162244    projectName     => { },
    163245    projectRef => {
     
    213295    speakerPlacement=> { },
    214296    startTimecode   => { Struct => \%sTimecode },
     297    startTimeSampleSize => { Writable => 'integer' }, #PH
     298    startTimeScale  => { }, #PH (real?)
    215299    stretchMode     => {
    216300        PrintConv => {
     
    270354        },
    271355    },
    272     videoCompressor     => { },
     356    videoCompressor => { },
    273357    videoFieldOrder => {
    274358        PrintConv => {
     
    278362        },
    279363    },
    280     videoFrameRate      => { },
    281     videoFrameSize      => { Struct => \%sDimensions },
    282     videoModDate        => { Groups => { 2 => 'Time' }, %dateTimeInfo },
     364    videoFrameRate  => { Writable => 'real' },
     365    videoFrameSize  => { Struct => \%sDimensions },
     366    videoModDate    => { Groups => { 2 => 'Time' }, %dateTimeInfo },
    283367    videoPixelAspectRatio => { Writable => 'rational' },
    284368    videoPixelDepth => {
     
    295379
    296380#------------------------------------------------------------------------------
    297 # PLUS vocabulary conversions
    298 my %plusVocab = (
    299     ValueConv => '$val =~ s{http://ns.useplus.org/ldf/vocab/}{}; $val',
    300     ValueConvInv => '"http://ns.useplus.org/ldf/vocab/$val"',
    301 );
    302 
    303 # PLUS License Data Format 1.2.0 structures
    304 # (this seems crazy to me -- why did they define different ID/Name structures
    305 #  for each field rather than just re-using the same structure?)
    306 my %plusLicensee = (
    307     STRUCT_NAME => 'Licensee',
    308     NAMESPACE => 'plus',
    309     TYPE => 'plus:LicenseeDetail',
    310     LicenseeID  => { },
    311     LicenseeName=> { },
    312 );
    313 my %plusEndUser = (
    314     STRUCT_NAME => 'EndUser',
    315     NAMESPACE   => 'plus',
    316     TYPE => 'plus:EndUserDetail',
    317     EndUserID   => { },
    318     EndUserName => { },
    319 );
    320 my %plusLicensor = (
    321     STRUCT_NAME => 'Licensor',
    322     NAMESPACE   => 'plus',
    323     TYPE => 'plus:LicensorDetail',
    324     LicensorID              => { },
    325     LicensorName            => { },
    326     LicensorStreetAddress   => { },
    327     LicensorExtendedAddress => { },
    328     LicensorCity            => { },
    329     LicensorRegion          => { },
    330     LicensorPostalCode      => { },
    331     LicensorCountry         => { },
    332     LicensorTelephoneType1  => {
    333         %plusVocab,
    334         PrintConv => {
    335             'work'  => 'Work',
    336             'cell'  => 'Cell',
    337             'fax'   => 'FAX',
    338             'home'  => 'Home',
    339             'pager' => 'Pager',
    340         },
    341     },
    342     LicensorTelephone1      => { },
    343     LicensorTelephoneType2  => {
    344         %plusVocab,
    345         PrintConv => {
    346             'work'  => 'Work',
    347             'cell'  => 'Cell',
    348             'fax'   => 'FAX',
    349             'home'  => 'Home',
    350             'pager' => 'Pager',
    351         },
    352     },
    353     LicensorTelephone2  => { },
    354     LicensorEmail       => { },
    355     LicensorURL         => { },
    356 );
    357 my %plusCopyrightOwner = (
    358     STRUCT_NAME => 'CopyrightOwner',
    359     NAMESPACE   => 'plus',
    360     TYPE        => 'plus:CopyrightOwnerDetail',
    361     CopyrightOwnerID    => { },
    362     CopyrightOwnerName  => { },
    363 );
    364 my %plusImageCreator = (
    365     STRUCT_NAME => 'ImageCreator',
    366     NAMESPACE   => 'plus',
    367     TYPE        => 'plus:ImageCreatorDetail',
    368     ImageCreatorID      => { },
    369     ImageCreatorName    => { },
    370 );
    371 my %plusImageSupplier = (
    372     STRUCT_NAME => 'ImageSupplier',
    373     NAMESPACE   => 'plus',
    374     TYPE        => 'plus:ImageSupplierDetail',
    375     ImageSupplierID     => { },
    376     ImageSupplierName   => { },
    377 );
    378 
    379 # PLUS License Data Format 1.2.0 (plus) (ref 1)
    380 %Image::ExifTool::XMP::plus = (
    381     %xmpTableDefaults,
    382     GROUPS => { 0 => 'XMP', 1 => 'XMP-plus', 2 => 'Author' },
    383     NAMESPACE => 'plus',
     381# IPTC Extensions version 1.3 (+ proposed video extensions)
     382
     383# IPTC Extension 1.0 structures
     384my %sLocationDetails = (
     385    STRUCT_NAME => 'LocationDetails',
     386    NAMESPACE   => 'Iptc4xmpExt',
     387    GROUPS      => { 2 => 'Location' },
     388    Identifier  => { List => 'Bag', Namespace => 'xmp' },
     389    City        => { },
     390    CountryCode => { },
     391    CountryName => { },
     392    ProvinceState => { },
     393    Sublocation => { },
     394    WorldRegion => { },
     395    LocationId  => { List => 'Bag' },
     396    LocationName => { Writable => 'lang-alt' },
     397    GPSLatitude  => { Namespace => 'exif', %latConv },
     398    GPSLongitude => { Namespace => 'exif', %longConv },
     399    GPSAltitude => {
     400        Namespace => 'exif',
     401        Writable => 'rational',
     402        PrintConv => '$val =~ /^(inf|undef)$/ ? $val : "$val m"',
     403        PrintConvInv => '$val=~s/\s*m$//;$val',
     404    },
     405);
     406my %sCVTermDetails = (
     407    STRUCT_NAME => 'CVTermDetails',
     408    NAMESPACE   => 'Iptc4xmpExt',
     409    CvTermId    => { },
     410    CvTermName  => { Writable => 'lang-alt' },
     411    CvId        => { },
     412    CvTermRefinedAbout => { },
     413);
     414
     415# IPTC video extensions
     416my %sPublicationEvent = (
     417    STRUCT_NAME => 'PublicationEvent',
     418    NAMESPACE   => 'Iptc4xmpExt',
     419    Date        => { Groups => { 2 => 'Time' }, %dateTimeInfo },
     420    Name        => { },
     421    Identifier  => { },
     422);
     423my %sEntity = (
     424    STRUCT_NAME => 'Entity',
     425    NAMESPACE   => 'Iptc4xmpExt',
     426    Identifier  => { List => 'Bag', Namespace => 'xmp' },
     427    Name        => { Writable => 'lang-alt' },
     428);
     429my %sEntityWithRole = (
     430    STRUCT_NAME => 'EntityWithRole',
     431    NAMESPACE   => 'Iptc4xmpExt',
     432    Identifier  => { List => 'Bag', Namespace => 'xmp' },
     433    Name        => { Writable => 'lang-alt' },
     434    Role        => { List => 'Bag' },
     435);
     436# (no longer used)
     437#my %sFrameSize = (
     438#    STRUCT_NAME => 'FrameSize',
     439#    NAMESPACE   => 'Iptc4xmpExt',
     440#    WidthPixels  => { Writable => 'integer' },
     441#    HeightPixels => { Writable => 'integer' },
     442#);
     443my %sRating = (
     444    STRUCT_NAME => 'Rating',
     445    NAMESPACE   => 'Iptc4xmpExt',
     446    RatingValue         => { FlatName => 'Value' },
     447    RatingSourceLink    => { FlatName => 'SourceLink' },
     448    RatingScaleMinValue => { FlatName => 'ScaleMinValue' },
     449    RatingScaleMaxValue => { FlatName => 'ScaleMaxValue' },
     450    RatingValueLogoLink => { FlatName => 'ValueLogoLink' },
     451    RatingRegion => {
     452        FlatName => 'Region',
     453        Struct => \%sLocationDetails,
     454        List => 'Bag',
     455    },
     456);
     457my %sEpisode = (
     458    STRUCT_NAME => 'EpisodeOrSeason',
     459    NAMESPACE   => 'Iptc4xmpExt',
     460    Name        => { },
     461    Number      => { },
     462    Identifier  => { },
     463);
     464my %sSeries = (
     465    STRUCT_NAME => 'Series',
     466    NAMESPACE   => 'Iptc4xmpExt',
     467    Name        => { },
     468    Identifier  => { },
     469);
     470my %sTemporalCoverage = (
     471    STRUCT_NAME => 'TemporalCoverage',
     472    NAMESPACE   => 'Iptc4xmpExt',
     473    tempCoverageFrom => { FlatName => 'From', %dateTimeInfo, Groups => { 2 => 'Time' } },
     474    tempCoverageTo   => { FlatName => 'To',   %dateTimeInfo, Groups => { 2 => 'Time' } },
     475);
     476my %sQualifiedLink = (
     477    STRUCT_NAME => 'QualifiedLink',
     478    NAMESPACE   => 'Iptc4xmpExt',
     479    Link        => { },
     480    LinkQualifier => { },
     481);
     482my %sTextRegion = (
     483    STRUCT_NAME => 'TextRegion',
     484    NAMESPACE   => 'Iptc4xmpExt',
     485    RegionText  => { },
     486    Region      => { Struct => \%Image::ExifTool::XMP::sArea },
     487);
     488my %sLinkedImage = (
     489    STRUCT_NAME => 'LinkedImage',
     490    NAMESPACE   => 'Iptc4xmpExt',
     491    Link        => { },
     492    LinkQualifier => { List => 'Bag' },
     493    ImageRole   => { },
     494   'format'     => { Namespace => 'dc' },
     495    WidthPixels => { Writable => 'integer' },
     496    HeightPixels=> { Writable => 'integer' },
     497    UsedVideoFrame => { Struct => \%sTimecode },
     498);
     499my %sBoundaryPoint = ( # new in 1.5
     500    STRUCT_NAME => 'BoundaryPoint',
     501    NAMESPACE   => 'Iptc4xmpExt',
     502    rbX => { FlatName => 'X', Writable => 'real' },
     503    rbY => { FlatName => 'Y', Writable => 'real' },
     504);
     505my %sRegionBoundary = ( # new in 1.5
     506    STRUCT_NAME => 'RegionBoundary',
     507    NAMESPACE   => 'Iptc4xmpExt',
     508    rbShape => { FlatName => 'Shape', PrintConv => { rectangle => 'Rectangle', circle => 'Circle', polygon => 'Polygon' } },
     509    rbUnit  => { FlatName => 'Unit',  PrintConv => { pixel => 'Pixel', relative => 'Relative' } },
     510    rbX => { FlatName => 'X', Writable => 'real' },
     511    rbY => { FlatName => 'Y', Writable => 'real' },
     512    rbW => { FlatName => 'W', Writable => 'real' },
     513    rbH => { FlatName => 'H', Writable => 'real' },
     514    rbRx => { FlatName => 'Rx', Writable => 'real' },
     515    rbVertices => { FlatName => 'Vertices', List => 'Seq', Struct => \%sBoundaryPoint },
     516);
     517my %sImageRegion = ( # new in 1.5
     518    STRUCT_NAME => 'ImageRegion',
     519    NAMESPACE   => undef,   # undefined to allow variable-namespace extensions
    384520    NOTES => q{
    385         PLUS License Data Format 1.2.0 schema tags.  Note that all
    386         controlled-vocabulary tags in this table (ie. tags with a fixed set of
    387         values) have raw values which begin with "http://ns.useplus.org/ldf/vocab/",
    388         but to reduce clutter this prefix has been removed from the values shown
    389         below.  (see L<http://ns.useplus.org/>)
    390     },
    391     Version  => { Name => 'PLUSVersion' },
    392     Licensee => {
    393         Struct => \%plusLicensee,
    394         List => 'Seq',
    395     },
    396     LicenseeLicenseeID   => { Flat => 1, Name => 'LicenseeID' },
    397     LicenseeLicenseeName => { Flat => 1, Name => 'LicenseeName' },
    398     EndUser => {
    399         Struct => \%plusEndUser,
    400         List => 'Seq',
    401     },
    402     EndUserEndUserID    => { Flat => 1, Name => 'EndUserID' },
    403     EndUserEndUserName  => { Flat => 1, Name => 'EndUserName' },
    404     Licensor => {
    405         Struct => \%plusLicensor,
    406         List => 'Seq',
    407     },
    408     LicensorLicensorID              => { Flat => 1, Name => 'LicensorID' },
    409     LicensorLicensorName            => { Flat => 1, Name => 'LicensorName' },
    410     LicensorLicensorStreetAddress   => { Flat => 1, Name => 'LicensorStreetAddress' },
    411     LicensorLicensorExtendedAddress => { Flat => 1, Name => 'LicensorExtendedAddress' },
    412     LicensorLicensorCity            => { Flat => 1, Name => 'LicensorCity' },
    413     LicensorLicensorRegion          => { Flat => 1, Name => 'LicensorRegion' },
    414     LicensorLicensorPostalCode      => { Flat => 1, Name => 'LicensorPostalCode' },
    415     LicensorLicensorCountry         => { Flat => 1, Name => 'LicensorCountry' },
    416     LicensorLicensorTelephoneType1  => { Flat => 1, Name => 'LicensorTelephoneType1' },
    417     LicensorLicensorTelephone1      => { Flat => 1, Name => 'LicensorTelephone1' },
    418     LicensorLicensorTelephoneType2  => { Flat => 1, Name => 'LicensorTelephoneType2' },
    419     LicensorLicensorTelephone2      => { Flat => 1, Name => 'LicensorTelephone2' },
    420     LicensorLicensorEmail           => { Flat => 1, Name => 'LicensorEmail' },
    421     LicensorLicensorURL             => { Flat => 1, Name => 'LicensorURL' },
    422     LicensorNotes               => { Writable => 'lang-alt' },
    423     MediaSummaryCode            => { },
    424     LicenseStartDate            => { %dateTimeInfo, Groups => { 2 => 'Time'} },
    425     LicenseEndDate              => { %dateTimeInfo, Groups => { 2 => 'Time'} },
    426     MediaConstraints            => { Writable => 'lang-alt' },
    427     RegionConstraints           => { Writable => 'lang-alt' },
    428     ProductOrServiceConstraints => { Writable => 'lang-alt' },
    429     ImageFileConstraints => {
    430         List => 'Bag',
    431         %plusVocab,
    432         PrintConv => {
    433             'IF-MFN' => 'Maintain File Name',
    434             'IF-MID' => 'Maintain ID in File Name',
    435             'IF-MMD' => 'Maintain Metadata',
    436             'IF-MFT' => 'Maintain File Type',
    437         },
    438     },
    439     ImageAlterationConstraints => {
    440         List => 'Bag',
    441         %plusVocab,
    442         PrintConv => {
    443             'AL-CRP' => 'No Cropping',
    444             'AL-FLP' => 'No Flipping',
    445             'AL-RET' => 'No Retouching',
    446             'AL-CLR' => 'No Colorization',
    447             'AL-DCL' => 'No De-Colorization',
    448             'AL-MRG' => 'No Merging',
    449         },
    450     },
    451     ImageDuplicationConstraints => {
    452         %plusVocab,
    453         PrintConv => {
    454             'DP-NDC' => 'No Duplication Constraints',
    455             'DP-LIC' => 'Duplication Only as Necessary Under License',
    456             'DP-NOD' => 'No Duplication',
    457         },
    458     },
    459     ModelReleaseStatus => {
    460         %plusVocab,
    461         PrintConv => {
    462             'MR-NON' => 'None',
    463             'MR-NAP' => 'Not Applicable',
    464             'MR-UMR' => 'Unlimited Model Releases',
    465             'MR-LMR' => 'Limited or Incomplete Model Releases',
    466         },
    467     },
    468     ModelReleaseID      => { List => 'Bag' },
    469     MinorModelAgeDisclosure => {
    470         %plusVocab,
    471         PrintConv => {
    472             'AG-UNK' => 'Age Unknown',
    473             'AG-A25' => 'Age 25 or Over',
    474             'AG-A24' => 'Age 24',
    475             'AG-A23' => 'Age 23',
    476             'AG-A22' => 'Age 22',
    477             'AG-A21' => 'Age 21',
    478             'AG-A20' => 'Age 20',
    479             'AG-A19' => 'Age 19',
    480             'AG-A18' => 'Age 18',
    481             'AG-A17' => 'Age 17',
    482             'AG-A16' => 'Age 16',
    483             'AG-A15' => 'Age 15',
    484             'AG-U14' => 'Age 14 or Under',
    485         },
    486     },
    487     PropertyReleaseStatus => {
    488         %plusVocab,
    489         PrintConv => {
    490             'PR-NON' => 'None',
    491             'PR-NAP' => 'Not Applicable',
    492             'PR-UPR' => 'Unlimited Property Releases',
    493             'PR-LPR' => 'Limited or Incomplete Property Releases',
    494         },
    495     },
    496     PropertyReleaseID  => { List => 'Bag' },
    497     OtherConstraints   => { Writable => 'lang-alt' },
    498     CreditLineRequired => {
    499         %plusVocab,
    500         PrintConv => {
    501             'CR-NRQ' => 'Not Required',
    502             'CR-COI' => 'Credit on Image',
    503             'CR-CAI' => 'Credit Adjacent To Image',
    504             'CR-CCA' => 'Credit in Credits Area',
    505         },
    506     },
    507     AdultContentWarning => {
    508         %plusVocab,
    509         PrintConv => {
    510             'CW-NRQ' => 'Not Required',
    511             'CW-AWR' => 'Adult Content Warning Required',
    512             'CW-UNK' => 'Unknown',
    513         },
    514     },
    515     OtherLicenseRequirements    => { Writable => 'lang-alt' },
    516     TermsAndConditionsText      => { Writable => 'lang-alt' },
    517     TermsAndConditionsURL       => { },
    518     OtherConditions             => { Writable => 'lang-alt' },
    519     ImageType => {
    520         %plusVocab,
    521         PrintConv => {
    522             'TY-PHO' => 'Photographic Image',
    523             'TY-ILL' => 'Illustrated Image',
    524             'TY-MCI' => 'Multimedia or Composited Image',
    525             'TY-VID' => 'Video',
    526             'TY-OTR' => 'Other',
    527         },
    528     },
    529     LicensorImageID     => { },
    530     FileNameAsDelivered => { },
    531     ImageFileFormatAsDelivered => {
    532         %plusVocab,
    533         PrintConv => {
    534             'FF-JPG' => 'JPEG Interchange Formats (JPG, JIF, JFIF)',
    535             'FF-TIF' => 'Tagged Image File Format (TIFF)',
    536             'FF-GIF' => 'Graphics Interchange Format (GIF)',
    537             'FF-RAW' => 'Proprietary RAW Image Format',
    538             'FF-DNG' => 'Digital Negative (DNG)',
    539             'FF-EPS' => 'Encapsulated PostScript (EPS)',
    540             'FF-BMP' => 'Windows Bitmap (BMP)',
    541             'FF-PSD' => 'Photoshop Document (PSD)',
    542             'FF-PIC' => 'Macintosh Picture (PICT)',
    543             'FF-PNG' => 'Portable Network Graphics (PNG)',
    544             'FF-WMP' => 'Windows Media Photo (HD Photo)',
    545             'FF-OTR' => 'Other',
    546         },
    547     },
    548     ImageFileSizeAsDelivered => {
    549         %plusVocab,
    550         PrintConv => {
    551             'SZ-U01' => 'Up to 1 MB',
    552             'SZ-U10' => 'Up to 10 MB',
    553             'SZ-U30' => 'Up to 30 MB',
    554             'SZ-U50' => 'Up to 50 MB',
    555             'SZ-G50' => 'Greater than 50 MB',
    556         },
    557     },
    558     CopyrightStatus => {
    559         %plusVocab,
    560         PrintConv => {
    561             'CS-PRO' => 'Protected',
    562             'CS-PUB' => 'Public Domain',
    563             'CS-UNK' => 'Unknown',
    564         },
    565     },
    566     CopyrightRegistrationNumber => { },
    567     FirstPublicationDate        => { %dateTimeInfo, Groups => { 2 => 'Time'} },
    568     CopyrightOwner              => { Struct => \%plusCopyrightOwner, List => 'Seq' },
    569     CopyrightOwnerCopyrightOwnerID   => { Flat => 1, Name => 'CopyrightOwnerID' },
    570     CopyrightOwnerCopyrightOwnerName => { Flat => 1, Name => 'CopyrightOwnerName' },
    571     CopyrightOwnerImageID            => { },
    572     ImageCreator => {
    573         Struct => \%plusImageCreator,
    574         List => 'Seq',
    575     },
    576     ImageCreatorImageCreatorID   => { Flat => 1, Name => 'ImageCreatorID' },
    577     ImageCreatorImageCreatorName => { Flat => 1, Name => 'ImageCreatorName' },
    578     ImageCreatorImageID          => { },
    579     ImageSupplier => {
    580         Struct => \%plusImageSupplier,
    581         List => 'Seq',
    582     },
    583     ImageSupplierImageSupplierID   => { Flat => 1, Name => 'ImageSupplierID' },
    584     ImageSupplierImageSupplierName => { Flat => 1, Name => 'ImageSupplierName' },
    585     ImageSupplierImageID    => { },
    586     LicenseeImageID         => { },
    587     LicenseeImageNotes      => { Writable => 'lang-alt' },
    588     OtherImageInfo          => { Writable => 'lang-alt' },
    589     LicenseID               => { },
    590     LicensorTransactionID   => { List => 'Bag' },
    591     LicenseeTransactionID   => { List => 'Bag' },
    592     LicenseeProjectReference=> { List => 'Bag' },
    593     LicenseTransactionDate  => { %dateTimeInfo, Groups => { 2 => 'Time'} },
    594     Reuse => {
    595         %plusVocab,
    596         PrintConv => {
    597             'RE-REU' => 'Repeat Use',
    598             'RE-NAP' => 'Not Applicable',
    599         },
    600     },
    601     OtherLicenseDocuments   => { List => 'Bag' },
    602     OtherLicenseInfo        => { Writable => 'lang-alt' },
    603     # Note: these are Bag's of lang-alt lists -- a nested list tag!
    604     Custom1     => { List => 'Bag', Writable => 'lang-alt' },
    605     Custom2     => { List => 'Bag', Writable => 'lang-alt' },
    606     Custom3     => { List => 'Bag', Writable => 'lang-alt' },
    607     Custom4     => { List => 'Bag', Writable => 'lang-alt' },
    608     Custom5     => { List => 'Bag', Writable => 'lang-alt' },
    609     Custom6     => { List => 'Bag', Writable => 'lang-alt' },
    610     Custom7     => { List => 'Bag', Writable => 'lang-alt' },
    611     Custom8     => { List => 'Bag', Writable => 'lang-alt' },
    612     Custom9     => { List => 'Bag', Writable => 'lang-alt' },
    613     Custom10    => { List => 'Bag', Writable => 'lang-alt' },
     521        This structure is new in the IPTC Extension version 1.5 specification.  As
     522        well as the fields defined below, this structure may contain any top-level
     523        XMP tags, but since they aren't pre-defined the only way to add these tags
     524        is to write ImageRegion as a structure with these tags as new fields.
     525    },
     526    RegionBoundary => { Namespace => 'Iptc4xmpExt', FlatName => 'Boundary', Struct => \%sRegionBoundary },
     527    rId    => { Namespace => 'Iptc4xmpExt', FlatName => 'ID' },
     528    Name   => { Namespace => 'Iptc4xmpExt', Writable => 'lang-alt' },
     529    rCtype => { Namespace => 'Iptc4xmpExt', FlatName => 'Ctype', List => 'Bag', Struct => \%sEntity },
     530    rRole  => { Namespace => 'Iptc4xmpExt', FlatName => 'Role',  List => 'Bag', Struct => \%sEntity },
     531);
     532
     533# IPTC Extension namespace properties (Iptc4xmpExt) (ref 4)
     534%Image::ExifTool::XMP::iptcExt = (
     535    %xmpTableDefaults,
     536    GROUPS => { 1 => 'XMP-iptcExt', 2 => 'Author' },
     537    NAMESPACE   => 'Iptc4xmpExt',
     538    TABLE_DESC => 'XMP IPTC Extension',
     539    NOTES => q{
     540        This table contains tags defined by the IPTC Extension schema version 1.5.
     541        The actual namespace prefix is "Iptc4xmpExt", but ExifTool shortens this for
     542        the family 1 group name. (see L<http://www.iptc.org/IPTC4XMP/>)
     543    },
     544    AboutCvTerm => {
     545        Struct => \%sCVTermDetails,
     546        List => 'Bag',
     547    },
     548    AboutCvTermCvId                 => { Flat => 1, Name => 'AboutCvTermCvId' },
     549    AboutCvTermCvTermId             => { Flat => 1, Name => 'AboutCvTermId' },
     550    AboutCvTermCvTermName           => { Flat => 1, Name => 'AboutCvTermName' },
     551    AboutCvTermCvTermRefinedAbout   => { Flat => 1, Name => 'AboutCvTermRefinedAbout' },
     552    AddlModelInfo   => { Name => 'AdditionalModelInformation' },
     553    ArtworkOrObject => {
     554        Struct => {
     555            STRUCT_NAME => 'ArtworkOrObjectDetails',
     556            NAMESPACE   => 'Iptc4xmpExt',
     557            AOCopyrightNotice => { },
     558            AOCreator    => { List => 'Seq' },
     559            AODateCreated=> { Groups => { 2 => 'Time' }, %dateTimeInfo },
     560            AOSource     => { },
     561            AOSourceInvNo=> { },
     562            AOTitle      => { Writable => 'lang-alt' },
     563            AOCurrentCopyrightOwnerName => { },
     564            AOCurrentCopyrightOwnerId   => { },
     565            AOCurrentLicensorName       => { },
     566            AOCurrentLicensorId         => { },
     567            AOCreatorId                 => { List => 'Seq' },
     568            AOCircaDateCreated          => { Groups => { 2 => 'Time' }, Protected => 1 },
     569            AOStylePeriod               => { List => 'Bag' },
     570            AOSourceInvURL              => { },
     571            AOContentDescription        => { Writable => 'lang-alt' },
     572            AOContributionDescription   => { Writable => 'lang-alt' },
     573            AOPhysicalDescription       => { Writable => 'lang-alt' },
     574        },
     575        List => 'Bag',
     576    },
     577    ArtworkOrObjectAOCopyrightNotice           => { Flat => 1, Name => 'ArtworkCopyrightNotice' },
     578    ArtworkOrObjectAOCreator                   => { Flat => 1, Name => 'ArtworkCreator' },
     579    ArtworkOrObjectAODateCreated               => { Flat => 1, Name => 'ArtworkDateCreated' },
     580    ArtworkOrObjectAOSource                    => { Flat => 1, Name => 'ArtworkSource' },
     581    ArtworkOrObjectAOSourceInvNo               => { Flat => 1, Name => 'ArtworkSourceInventoryNo' },
     582    ArtworkOrObjectAOTitle                     => { Flat => 1, Name => 'ArtworkTitle' },
     583    ArtworkOrObjectAOCurrentCopyrightOwnerName => { Flat => 1, Name => 'ArtworkCopyrightOwnerName' },
     584    ArtworkOrObjectAOCurrentCopyrightOwnerId   => { Flat => 1, Name => 'ArtworkCopyrightOwnerID' },
     585    ArtworkOrObjectAOCurrentLicensorName       => { Flat => 1, Name => 'ArtworkLicensorName' },
     586    ArtworkOrObjectAOCurrentLicensorId         => { Flat => 1, Name => 'ArtworkLicensorID' },
     587    ArtworkOrObjectAOCreatorId                 => { Flat => 1, Name => 'ArtworkCreatorID' },
     588    ArtworkOrObjectAOCircaDateCreated          => { Flat => 1, Name => 'ArtworkCircaDateCreated' },
     589    ArtworkOrObjectAOStylePeriod               => { Flat => 1, Name => 'ArtworkStylePeriod' },
     590    ArtworkOrObjectAOSourceInvURL              => { Flat => 1, Name => 'ArtworkSourceInvURL' },
     591    ArtworkOrObjectAOContentDescription        => { Flat => 1, Name => 'ArtworkContentDescription' },
     592    ArtworkOrObjectAOContributionDescription   => { Flat => 1, Name => 'ArtworkContributionDescription' },
     593    ArtworkOrObjectAOPhysicalDescription       => { Flat => 1, Name => 'ArtworkPhysicalDescription' },
     594    CVterm => {
     595        Name => 'ControlledVocabularyTerm',
     596        List => 'Bag',
     597        Notes => 'deprecated by version 1.2',
     598    },
     599    DigImageGUID            => { Groups => { 2 => 'Image' }, Name => 'DigitalImageGUID' },
     600    DigitalSourcefileType   => {
     601        Name => 'DigitalSourceFileType',
     602        Notes => 'now deprecated -- replaced by DigitalSourceType',
     603        Groups => { 2 => 'Image' },
     604    },
     605    DigitalSourceType       => { Name => 'DigitalSourceType', Groups => { 2 => 'Image' } },
     606    EmbdEncRightsExpr => {
     607        Struct => {
     608            STRUCT_NAME => 'EEREDetails',
     609            NAMESPACE   => 'Iptc4xmpExt',
     610            EncRightsExpr       => { },
     611            RightsExprEncType   => { },
     612            RightsExprLangId    => { },
     613        },
     614        List => 'Bag',
     615    },
     616    EmbdEncRightsExprEncRightsExpr      => { Flat => 1, Name => 'EmbeddedEncodedRightsExpr' },
     617    EmbdEncRightsExprRightsExprEncType  => { Flat => 1, Name => 'EmbeddedEncodedRightsExprType' },
     618    EmbdEncRightsExprRightsExprLangId   => { Flat => 1, Name => 'EmbeddedEncodedRightsExprLangID' },
     619    Event       => { Writable => 'lang-alt' },
     620    IptcLastEdited => {
     621        Name => 'IPTCLastEdited',
     622        Groups => { 2 => 'Time' },
     623        %dateTimeInfo,
     624    },
     625    LinkedEncRightsExpr => {
     626        Struct => {
     627            STRUCT_NAME => 'LEREDetails',
     628            NAMESPACE   => 'Iptc4xmpExt',
     629            LinkedRightsExpr    => { },
     630            RightsExprEncType   => { },
     631            RightsExprLangId    => { },
     632        },
     633        List => 'Bag',
     634    },
     635    LinkedEncRightsExprLinkedRightsExpr  => { Flat => 1, Name => 'LinkedEncodedRightsExpr' },
     636    LinkedEncRightsExprRightsExprEncType => { Flat => 1, Name => 'LinkedEncodedRightsExprType' },
     637    LinkedEncRightsExprRightsExprLangId  => { Flat => 1, Name => 'LinkedEncodedRightsExprLangID' },
     638    LocationCreated => {
     639        Struct => \%sLocationDetails,
     640        Groups => { 2 => 'Location' },
     641        List => 'Bag',
     642    },
     643    LocationShown => {
     644        Struct => \%sLocationDetails,
     645        Groups => { 2 => 'Location' },
     646        List => 'Bag',
     647    },
     648    MaxAvailHeight          => { Groups => { 2 => 'Image' }, Writable => 'integer' },
     649    MaxAvailWidth           => { Groups => { 2 => 'Image' }, Writable => 'integer' },
     650    ModelAge                => { List => 'Bag', Writable => 'integer' },
     651    OrganisationInImageCode => { List => 'Bag' },
     652    OrganisationInImageName => { List => 'Bag' },
     653    PersonInImage           => { List => 'Bag' },
     654    PersonInImageWDetails => {
     655        Struct => {
     656            STRUCT_NAME => 'PersonDetails',
     657            NAMESPACE   => 'Iptc4xmpExt',
     658            PersonId    => { List => 'Bag' },
     659            PersonName  => { Writable => 'lang-alt' },
     660            PersonCharacteristic => {
     661                Struct  => \%sCVTermDetails,
     662                List    => 'Bag',
     663            },
     664            PersonDescription => { Writable => 'lang-alt' },
     665        },
     666        List => 'Bag',
     667    },
     668    PersonInImageWDetailsPersonId                               => { Flat => 1, Name => 'PersonInImageId' },
     669    PersonInImageWDetailsPersonName                             => { Flat => 1, Name => 'PersonInImageName' },
     670    PersonInImageWDetailsPersonCharacteristic                   => { Flat => 1, Name => 'PersonInImageCharacteristic' },
     671    PersonInImageWDetailsPersonCharacteristicCvId               => { Flat => 1, Name => 'PersonInImageCvTermCvId' },
     672    PersonInImageWDetailsPersonCharacteristicCvTermId           => { Flat => 1, Name => 'PersonInImageCvTermId' },
     673    PersonInImageWDetailsPersonCharacteristicCvTermName         => { Flat => 1, Name => 'PersonInImageCvTermName' },
     674    PersonInImageWDetailsPersonCharacteristicCvTermRefinedAbout => { Flat => 1, Name => 'PersonInImageCvTermRefinedAbout' },
     675    PersonInImageWDetailsPersonDescription                      => { Flat => 1, Name => 'PersonInImageDescription' },
     676    ProductInImage => {
     677        Struct => {
     678            STRUCT_NAME => 'ProductDetails',
     679            NAMESPACE   => 'Iptc4xmpExt',
     680            ProductName => { Writable => 'lang-alt' },
     681            ProductGTIN => { },
     682            ProductDescription => { Writable => 'lang-alt' },
     683        },
     684        List => 'Bag',
     685    },
     686    ProductInImageProductName        => { Flat => 1, Name => 'ProductInImageName' },
     687    ProductInImageProductGTIN        => { Flat => 1, Name => 'ProductInImageGTIN' },
     688    ProductInImageProductDescription => { Flat => 1, Name => 'ProductInImageDescription' },
     689    RegistryId => {
     690        Name => 'RegistryID',
     691        Struct => {
     692            STRUCT_NAME => 'RegistryEntryDetails',
     693            NAMESPACE   => 'Iptc4xmpExt',
     694            RegItemId   => { },
     695            RegOrgId    => { },
     696            RegEntryRole=> { }, # (new in 1.3)
     697        },
     698        List => 'Bag',
     699    },
     700    RegistryIdRegItemId => { Flat => 1, Name => 'RegistryItemID' },
     701    RegistryIdRegOrgId  => { Flat => 1, Name => 'RegistryOrganisationID' },
     702    RegistryIdRegEntryRole => { Flat => 1, Name => 'RegistryEntryRole' },
     703
     704    # new Extension 1.3 properties
     705    Genre           => { Groups => { 2 => 'Image' }, List => 'Bag', Struct => \%sCVTermDetails },
     706
     707    # new video properties (Oct 2016, ref Michael Steidl)
     708    # (see http://www.iptc.org/std/videometadatahub/recommendation/IPTC-VideoMetadataHub-props-Rec_1.0.html)
     709    CircaDateCreated=> { Groups => { 2 => 'Time' } },
     710    Episode         => { Groups => { 2 => 'Video' }, Struct => \%sEpisode },
     711    ExternalMetadataLink => { Groups => { 2 => 'Other' }, List => 'Bag' },
     712    FeedIdentifier  => { Groups => { 2 => 'Video' } },
     713    PublicationEvent=> { Groups => { 2 => 'Video' }, List => 'Bag', Struct => \%sPublicationEvent },
     714    Rating          => {
     715        Groups => { 2 => 'Other' },
     716        Struct  => \%sRating,
     717        List    => 'Bag',
     718    },
     719    ReleaseReady    => { Groups => { 2 => 'Other' }, Writable => 'boolean' },
     720    Season          => { Groups => { 2 => 'Video' }, Struct => \%sEpisode },
     721    Series          => { Groups => { 2 => 'Video' }, Struct => \%sSeries },
     722    StorylineIdentifier => { Groups => { 2 => 'Video' }, List => 'Bag' },
     723    StylePeriod     => { Groups => { 2 => 'Video' } },
     724    TemporalCoverage=> { Groups => { 2 => 'Video' }, Struct => \%sTemporalCoverage },
     725    WorkflowTag     => { Groups => { 2 => 'Video' }, Struct => \%sCVTermDetails },
     726    DataOnScreen    => { Groups => { 2 => 'Video' }, List => 'Bag', Struct => \%sTextRegion },
     727    Dopesheet       => { Groups => { 2 => 'Video' }, Writable => 'lang-alt' },
     728    DopesheetLink   => { Groups => { 2 => 'Video' }, List => 'Bag', Struct => \%sQualifiedLink },
     729    Headline        => { Groups => { 2 => 'Video' }, Writable => 'lang-alt', Avoid => 1 },
     730    PersonHeard     => { Groups => { 2 => 'Audio' }, List => 'Bag', Struct => \%sEntity },
     731    VideoShotType   => { Groups => { 2 => 'Video' }, List => 'Bag', Struct => \%sEntity },
     732    EventExt        => { Groups => { 2 => 'Video' }, List => 'Bag', Struct => \%sEntity, Name => 'ShownEvent' },
     733    Transcript      => { Groups => { 2 => 'Video' }, Writable => 'lang-alt' },
     734    TranscriptLink  => { Groups => { 2 => 'Video' }, List => 'Bag', Struct => \%sQualifiedLink },
     735    VisualColour    => {
     736        Name => 'VisualColor',
     737        Groups => { 2 => 'Video' },
     738        PrintConv => {
     739            'bw-monochrome' => 'Monochrome',
     740            'colour'        => 'Color',
     741        },
     742    },
     743    Contributor     => { List => 'Bag', Struct => \%sEntityWithRole },
     744    CopyrightYear   => { Groups => { 2 => 'Time' },  Writable => 'integer' },
     745    Creator         => { List => 'Bag', Struct => \%sEntityWithRole },
     746    SupplyChainSource => { Groups => { 2 => 'Other' }, List => 'Bag', Struct => \%sEntity },
     747    audioBitRate    => { Groups => { 2 => 'Audio' }, Writable => 'integer', Name => 'AudioBitrate' },
     748    audioBitRateMode=> {
     749        Name => 'AudioBitrateMode',
     750        Groups => { 2 => 'Audio' },
     751        PrintConv => {
     752            fixed => 'Fixed',
     753            variable => 'Variable',
     754        },
     755    },
     756    audioChannelCount       => { Groups => { 2 => 'Audio' }, Writable => 'integer' },
     757    videoDisplayAspectRatio => { Groups => { 2 => 'Audio' }, Writable => 'rational' },
     758    ContainerFormat         => { Groups => { 2 => 'Video' }, Struct => \%sEntity },
     759    StreamReady => {
     760        Groups => { 2 => 'Video' },
     761        PrintConv => {
     762            true => 'True',
     763            false => 'False',
     764            unknown => 'Unknown',
     765        },
     766    },
     767    videoBitRate     => { Groups => { 2 => 'Video' }, Writable => 'integer', Name => 'VideoBitrate' },
     768    videoBitRateMode => {
     769        Name => 'VideoBitrateMode',
     770        Groups => { 2 => 'Video' },
     771        PrintConv => {
     772            fixed => 'Fixed',
     773            variable => 'Variable',
     774        },
     775    },
     776    videoEncodingProfile => { Groups => { 2 => 'Video' } },
     777    videoStreamsCount    => { Groups => { 2 => 'Video' }, Writable => 'integer' },
     778    # new IPTC video metadata 1.1 properties
     779    # (ref https://www.iptc.org/std/videometadatahub/recommendation/IPTC-VideoMetadataHub-props-Rec_1.1.html)
     780    SnapshotLink => { Groups => { 2 => 'Image' }, List => 'Bag', Struct => \%sLinkedImage, Name => 'Snapshot' },
     781    # new IPTC video metadata 1.2 properties
     782    # (ref http://www.iptc.org/std/videometadatahub/recommendation/IPTC-VideoMetadataHub-props-Rec_1.2.html)
     783    RecDevice => {
     784        Groups => { 2 => 'Device' },
     785        Struct => {
     786            STRUCT_NAME => 'Device',
     787            NAMESPACE   => 'Iptc4xmpExt',
     788            Manufacturer        => { },
     789            ModelName           => { },
     790            SerialNumber        => { },
     791            AttLensDescription  => { },
     792            OwnersDeviceId      => { },
     793        },
     794    },
     795    PlanningRef         => { List => 'Bag', Struct => \%sEntityWithRole },
     796    audioBitsPerSample  => { Groups => { 2 => 'Audio' }, Writable => 'integer' },
     797    # new IPTC Extension schema 1.5 property
     798    ImageRegion => { Groups => { 2 => 'Image' }, List => 'Bag', Struct => \%sImageRegion },
    614799);
    615800
     
    617802# PRISM
    618803#
    619 # NOTE: The "Avoid" flag is set for all PRISM tags
     804# NOTE: The "Avoid" flag is set for all PRISM tags (via tag table AVOID flag)
    620805
    621806# my %obsolete = (
     
    631816# );
    632817
    633 # Publishing Requirements for Industry Standard Metadata 2.1 (prism) (ref 2)
     818# PRISM structure definitions
     819my %prismPublicationDate = (
     820    STRUCT_NAME => 'prismPublicationDate',
     821    NAMESPACE   => 'prism',
     822    date        => { %dateTimeInfo, Groups => { 2 => 'Time'} },
     823    'a-platform'=> { },
     824);
     825
     826# Publishing Requirements for Industry Standard Metadata (prism) (ref 2)
    634827%Image::ExifTool::XMP::prism = (
    635828    %xmpTableDefaults,
    636829    GROUPS => { 0 => 'XMP', 1 => 'XMP-prism', 2 => 'Document' },
    637830    NAMESPACE => 'prism',
     831    AVOID => 1,
    638832    NOTES => q{
    639         Publishing Requirements for Industry Standard Metadata 2.1 schema tags. (see
    640         L<http://www.prismstandard.org/>)
    641     },
     833        Publishing Requirements for Industry Standard Metadata 3.0 namespace
     834        tags.  (see L<http://www.prismstandard.org/>)
     835    },
     836    academicField   => { }, # (3.0)
     837    aggregateIssueNumber => { Writable => 'integer' }, # (3.0)
    642838    aggregationType => { List => 'Bag' },
    643     alternateTitle  => { List => 'Bag' },
     839    alternateTitle  => {
     840        List => 'Bag',
     841        Struct => { # (becomes a structure in 3.0)
     842            STRUCT_NAME => 'prismAlternateTitle',
     843            NAMESPACE   => 'prism',
     844            text        => { },
     845            'a-platform'=> { },
     846            'a-lang'    => { },
     847        },
     848    },
     849    blogTitle       => { }, # (3.0)
     850    blogURL         => { }, # (3.0)
     851    bookEdition     => { }, # (3.0)
    644852    byteCount       => { Writable => 'integer' },
    645     channel         => { List => 'Bag' },
     853    channel         => {
     854        List => 'Bag',
     855        Struct => { # (becomes a structure in 3.0)
     856            STRUCT_NAME => 'prismChannel',
     857            NAMESPACE   => 'prism',
     858            channel     => { },
     859            subchannel1 => { },
     860            subchannel2 => { },
     861            subchannel3 => { },
     862            subchannel4 => { },
     863            'a-lang'    => { },
     864        },
     865    },
    646866    complianceProfile=>{ PrintConv => { three => 'Three' } },
    647     copyright       => { Groups => { 2 => 'Author' } },
     867    contentType     => { }, # (3.0)
     868    copyrightYear   => { }, # (3.0)
     869    # copyright       => { Groups => { 2 => 'Author' } }, # (deprecated in 3.0)
    648870    corporateEntity => { List => 'Bag' },
    649871    coverDate       => { %dateTimeInfo, Groups => { 2 => 'Time'} },
     
    651873    creationDate    => { %dateTimeInfo, Groups => { 2 => 'Time'} },
    652874    dateRecieved    => { %dateTimeInfo, Groups => { 2 => 'Time'} },
     875    device          => { }, # (3.0)
    653876    distributor     => { },
    654877    doi             => { Name => 'DOI', Description => 'Digital Object Identifier' },
    655878    edition         => { },
    656879    eIssn           => { },
    657     embargoDate     => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
     880    #embargoDate     => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} }, # (deprecated in 3.0)
    658881    endingPage      => { },
    659882    event           => { List => 'Bag' },
    660     expirationDate  => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
     883    #expirationDate  => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} }, # (deprecated in 3.0)
    661884    genre           => { List => 'Bag' },
    662885    hasAlternative  => { List => 'Bag' },
    663     hasCorrection   => { },
    664     hasPreviousVersion => { },
     886    hasCorrection   => {
     887        Struct => { # (becomes a structure in 3.0)
     888            STRUCT_NAME => 'prismHasCorrection',
     889            NAMESPACE   => 'prism',
     890            text        => { },
     891            'a-platform'=> { },
     892            'a-lang'    => { },
     893        },
     894    },
     895    # hasPreviousVersion => { }, # (not in 3.0)
    665896    hasTranslation  => { List => 'Bag' },
    666897    industry        => { List => 'Bag' },
     898    isAlternativeOf => { List => 'Bag' }, # (3.0)
     899    isbn            => { Name => 'ISBN', List => 'Bag' }, # 2.1 (becomes a list in 3.0)
    667900    isCorrectionOf  => { List => 'Bag' },
    668901    issn            => { Name => 'ISSN' },
    669902    issueIdentifier => { },
    670903    issueName       => { },
     904    issueTeaser     => { }, # (3.0)
     905    issueType       => { }, # (3.0)
    671906    isTranslationOf => { },
    672907    keyword         => { List => 'Bag' },
    673     killDate        => { %dateTimeInfo, Groups => { 2 => 'Time'} },
     908    killDate        => {
     909        Struct => { # (becomes a structure in 3.0)
     910            STRUCT_NAME => 'prismKillDate',
     911            NAMESPACE   => 'prism',
     912            date        => { %dateTimeInfo, Groups => { 2 => 'Time'} },
     913            'a-platform'=> { }, #PH (missed in spec?)
     914        },
     915    },
     916   'link'           => { List => 'Bag' }, # (3.0)
    674917    location        => { List => 'Bag' },
    675918    # metadataContainer => { }, (not valid for PRISM XMP)
    676919    modificationDate=> { %dateTimeInfo, Groups => { 2 => 'Time'} },
     920    nationalCatalogNumber => { }, # (3.0)
    677921    number          => { },
    678922    object          => { List => 'Bag' },
     923    onSaleDate => { # (3.0)
     924        List => 'Bag',
     925        Struct => {
     926            STRUCT_NAME => 'prismOnSaleDate',
     927            NAMESPACE   => 'prism',
     928            date        => { %dateTimeInfo, Groups => { 2 => 'Time'} },
     929            'a-platform'=> { },
     930        },
     931    },
     932    onSaleDay => { # (3.0)
     933        List => 'Bag',
     934        Struct => {
     935            STRUCT_NAME => 'prismOnSaleDay',
     936            NAMESPACE   => 'prism',
     937            day         => { }, #PH (not named in spec)
     938            'a-platform'=> { },
     939        },
     940    },
     941    offSaleDate => { # (3.0)
     942        List => 'Bag',
     943        Struct => {
     944            STRUCT_NAME => 'prismOffSaleDate',
     945            NAMESPACE   => 'prism',
     946            date        => { %dateTimeInfo, Groups => { 2 => 'Time'} },
     947            'a-platform'=> { },
     948        },
     949    },
    679950    organization    => { List => 'Bag' },
    680951    originPlatform  => {
     
    690961        },
    691962    },
     963    pageCount       => { Writable => 'integer' }, # (3.0)
     964    pageProgressionDirection => { # (3.0)
     965        PrintConv => { LTR => 'Left to Right', RTL => 'Right to Left' },
     966    },
    692967    pageRange       => { List => 'Bag' },
    693968    person          => { },
    694     publicationDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
     969    platform        => { }, # (3.0)
     970    productCode     => { }, # (3.0)
     971    profession      => { }, # (3.0)
     972    publicationDate => {
     973        List => 'Bag',
     974        Struct => \%prismPublicationDate, # (becomes a structure in 3.0)
     975    },
     976    publicationDisplayDate => { # (3.0)
     977        List => 'Bag',
     978        Struct => \%prismPublicationDate,
     979    },
    695980    publicationName => { },
    696     rightsAgent     => { },
     981    publishingFrequency => { }, # (3.0)
     982    rating          => { },
     983    # rightsAgent     => { }, # (deprecated in 3.0)
     984    samplePageRange => { }, # (3.0)
    697985    section         => { },
     986    sellingAgency   => { }, # (3.0)
     987    seriesNumber    => { Writable => 'integer' }, # (3.0)
     988    seriesTitle     => { }, # (3.0)
     989    sport           => { }, # (3.0)
    698990    startingPage    => { },
    699991    subsection1     => { },
     
    701993    subsection3     => { },
    702994    subsection4     => { },
     995    subtitle        => { }, # (3.0)
     996    supplementDisplayID => { }, # (3.0)
     997    supplementStartingPage => { }, # (3.0)
     998    supplementTitle => { }, # (3.0)
    703999    teaser          => { List => 'Bag' },
    7041000    ticker          => { List => 'Bag' },
    7051001    timePeriod      => { },
    706     url             => { Name => 'URL', List => 'Bag' },
     1002    url             => {
     1003        Name => 'URL',
     1004        List => 'Bag',
     1005        Struct => { # (becomes a structure in 3.0)
     1006            STRUCT_NAME => 'prismUrl',
     1007            NAMESPACE   => 'prism',
     1008            url         => { },
     1009            'a-platform'=> { },
     1010        },
     1011    },
     1012    uspsNumber      => { }, # (3.0)
    7071013    versionIdentifier => { },
    7081014    volume          => { },
    7091015    wordCount       => { Writable => 'integer' },
    710     # new in PRISM 2.1
    711     isbn            => { Name => 'ISBN' },
    7121016# tags that existed in version 1.3
    7131017#    category        => { %obsolete, List => 'Bag' },
     
    7381042);
    7391043
    740 # PRISM Rights Language 2.1 schema (prl) (ref 2)
     1044# PRISM Rights Language namespace (prl) (ref 2)
    7411045%Image::ExifTool::XMP::prl = (
    7421046    %xmpTableDefaults,
    7431047    GROUPS => { 0 => 'XMP', 1 => 'XMP-prl', 2 => 'Document' },
    7441048    NAMESPACE => 'prl',
     1049    AVOID => 1,
    7451050    NOTES => q{
    746         PRISM Rights Language 2.1 schema tags.  (see
     1051        PRISM Rights Language 2.1 namespace tags.  These tags have been deprecated
     1052        since the release of the PRISM Usage Rights 3.0. (see
    7471053        L<http://www.prismstandard.org/>)
    7481054    },
     
    7521058);
    7531059
    754 # PRISM Usage Rights 2.1 schema (prismusagerights) (ref 2)
     1060# PRISM Usage Rights namespace (prismusagerights) (ref 2)
    7551061%Image::ExifTool::XMP::pur = (
    7561062    %xmpTableDefaults,
    7571063    GROUPS => { 0 => 'XMP', 1 => 'XMP-pur', 2 => 'Document' },
    7581064    NAMESPACE => 'pur',
     1065    AVOID => 1,
    7591066    NOTES => q{
    760         Prism Usage Rights 2.1 schema tags.  (see L<http://www.prismstandard.org/>)
     1067        PRISM Usage Rights 3.0 namespace tags.  (see
     1068        L<http://www.prismstandard.org/>)
    7611069    },
    7621070    adultContentWarning => { List => 'Bag' },
    7631071    agreement           => { List => 'Bag' },
    764     copyright           => { Writable => 'lang-alt', Groups => { 2 => 'Author' } },
     1072    copyright           => {
     1073        # (not clear in 3.0 spec, which lists only "bag Text", and called
     1074        #  "copyrightDate" instead of "copyright" the PRISM basic 3.0 spec)
     1075        Writable => 'lang-alt',
     1076        Groups => { 2 => 'Author' },
     1077    },
    7651078    creditLine          => { List => 'Bag' },
    7661079    embargoDate         => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
     
    7741087    rightsAgent         => { },
    7751088    rightsOwner         => { },
    776     usageFee            => { List => 'Bag' },
    777 );
    778 
    779 # DICOM schema properties (DICOM) (ref PH, written by CS3)
     1089    # usageFee            => { List => 'Bag' }, # (not in 3.0)
     1090);
     1091
     1092# PRISM Metadata for Images namespace (pmi) (ref 2)
     1093%Image::ExifTool::XMP::pmi = (
     1094    %xmpTableDefaults,
     1095    GROUPS => { 0 => 'XMP', 1 => 'XMP-pmi', 2 => 'Image' },
     1096    NAMESPACE => 'pmi',
     1097    AVOID => 1,
     1098    NOTES => q{
     1099        PRISM Metadata for Images 3.0 namespace tags.  (see
     1100        L<http://www.prismstandard.org/>)
     1101    },
     1102    color => {
     1103        PrintConv => {
     1104            bw => 'BW',
     1105            color => 'Color',
     1106            sepia => 'Sepia',
     1107            duotone => 'Duotone',
     1108            tritone => 'Tritone',
     1109            quadtone => 'Quadtone',
     1110        },
     1111    },
     1112    contactInfo     => { },
     1113    displayName     => { },
     1114    distributorProductID => { },
     1115    eventAlias      => { },
     1116    eventEnd        => { },
     1117    eventStart      => { },
     1118    eventSubtype    => { },
     1119    eventType       => { },
     1120    field           => { },
     1121    framing         => { },
     1122    location        => { },
     1123    make            => { },
     1124    manufacturer    => { },
     1125    model           => { },
     1126    modelYear       => { },
     1127    objectDescription=>{ },
     1128    objectSubtype   => { },
     1129    objectType      => { },
     1130    orientation => {
     1131        PrintConv => {
     1132            horizontal => 'Horizontal',
     1133            vertical => 'Vertical',
     1134        }
     1135    },
     1136    positionDescriptor => { },
     1137    productID       => { },
     1138    productIDType   => { },
     1139    season => {
     1140        PrintConv => {
     1141            spring => 'Spring',
     1142            summer => 'Summer',
     1143            fall => 'Fall',
     1144            winter => 'Winter',
     1145        },
     1146    },
     1147    sequenceName    => { },
     1148    sequenceNumber  => { },
     1149    sequenceTotalNumber => { },
     1150    setting         => { },
     1151    shootID         => { },
     1152    slideshowName   => { },
     1153    slideshowNumber => { Writable => 'integer' },
     1154    slideshowTotalNumber => { Writable => 'integer' },
     1155    viewpoint       => { },
     1156    visualTechnique => { },
     1157);
     1158
     1159# PRISM Recipe Metadata (prm) (ref 2)
     1160%Image::ExifTool::XMP::prm = (
     1161    %xmpTableDefaults,
     1162    GROUPS => { 0 => 'XMP', 1 => 'XMP-prm', 2 => 'Document' },
     1163    NAMESPACE => 'prm',
     1164    AVOID => 1,
     1165    NOTES => q{
     1166        PRISM Recipe Metadata 3.0 namespace tags.  (see
     1167        L<http://www.prismstandard.org/>)
     1168    },
     1169    cookingEquipment    => { },
     1170    cookingMethod       => { },
     1171    course              => { },
     1172    cuisine             => { },
     1173    dietaryNeeds        => { },
     1174    dishType            => { },
     1175    duration            => { },
     1176    ingredientExclusion => { },
     1177    mainIngredient      => { },
     1178    meal                => { },
     1179    recipeEndingPage    => { },
     1180    recipePageRange     => { },
     1181    recipeSource        => { },
     1182    recipeStartingPage  => { },
     1183    recipeTitle         => { },
     1184    servingSize         => { },
     1185    skillLevel          => { },
     1186    specialOccasion     => { },
     1187    yield               => { },
     1188);
     1189
     1190#------------------------------------------------------------------------------
     1191
     1192# DICOM namespace properties (DICOM) (ref PH, written by CS3)
    7801193%Image::ExifTool::XMP::DICOM = (
    7811194    %xmpTableDefaults,
    7821195    GROUPS => { 1 => 'XMP-DICOM', 2 => 'Image' },
    7831196    NAMESPACE => 'DICOM',
    784     NOTES => 'DICOM schema tags.',
     1197    NOTES => q{
     1198        DICOM namespace tags.  These XMP tags allow some DICOM information to be
     1199        stored in files of other than DICOM format.  See the
     1200        L<DICOM Tags documentation|Image::ExifTool::TagNames/DICOM Tags> for a list
     1201        of tags available in DICOM-format files.
     1202    },
    7851203    # change some tag names to correspond with DICOM tags
    7861204    PatientName             => { },
     
    8041222);
    8051223
    806 # PixelLive schema properties (PixelLive) (ref 3)
     1224# PixelLive namespace properties (PixelLive) (ref 3)
    8071225%Image::ExifTool::XMP::PixelLive = (
    8081226    GROUPS => { 1 => 'XMP-PixelLive', 2 => 'Image' },
    8091227    NAMESPACE => 'PixelLive',
     1228    AVOID => 1,
    8101229    NOTES => q{
    811         PixelLive schema tags.  These tags are not writable becase they are very
     1230        PixelLive namespace tags.  These tags are not writable because they are very
    8121231        uncommon and I haven't been able to locate a reference which gives the
    8131232        namespace URI.
    8141233    },
    815     AUTHOR    => { Name => 'Author',   Avoid => 1, Groups => { 2 => 'Author' } },
    816     COMMENTS  => { Name => 'Comments', Avoid => 1 },
    817     COPYRIGHT => { Name => 'Copyright',Avoid => 1, Groups => { 2 => 'Author' } },
    818     DATE      => { Name => 'Date',     Avoid => 1, Groups => { 2 => 'Time' } },
    819     GENRE     => { Name => 'Genre',    Avoid => 1 },
    820     TITLE     => { Name => 'Title',    Avoid => 1 },
    821 );
    822 
    823 # ACDSee schema (acdsee) (ref PH)
     1234    AUTHOR    => { Name => 'Author',    Groups => { 2 => 'Author' } },
     1235    COMMENTS  => { Name => 'Comments' },
     1236    COPYRIGHT => { Name => 'Copyright', Groups => { 2 => 'Author' } },
     1237    DATE      => { Name => 'Date',      Groups => { 2 => 'Time' } },
     1238    GENRE     => { Name => 'Genre' },
     1239    TITLE     => { Name => 'Title' },
     1240);
     1241
     1242# Extensis Portfolio tags (extensis) (ref 11)
     1243%Image::ExifTool::XMP::extensis = (
     1244    %xmpTableDefaults,
     1245    GROUPS => { 1 => 'XMP-extensis', 2 => 'Image' },
     1246    NAMESPACE => 'extensis',
     1247    NOTES => 'Tags used by Extensis Portfolio.',
     1248    Approved     => { Writable => 'boolean' },
     1249    ApprovedBy   => { },
     1250    ClientName   => { },
     1251    JobName      => { },
     1252    JobStatus    => { },
     1253    RoutedTo     => { },
     1254    RoutingNotes => { },
     1255    WorkToDo     => { },
     1256);
     1257
     1258# IDimager structures (ref PH)
     1259my %sTagStruct;
     1260%sTagStruct = (
     1261    STRUCT_NAME => 'TagStructure',
     1262    NAMESPACE => 'ics',
     1263    LabelName => { },
     1264    Reference => { },
     1265    ParentReference => { },
     1266    SubLabels => { Struct => \%sTagStruct, List => 'Bag' },
     1267);
     1268my %sSubVersion = (
     1269    STRUCT_NAME => 'SubVersion',
     1270    NAMESPACE => 'ics',
     1271    VersRef => { },
     1272    FileName => { },
     1273);
     1274
     1275# IDimager namespace (ics) (ref PH)
     1276%Image::ExifTool::XMP::ics = (
     1277    %xmpTableDefaults,
     1278    GROUPS => { 0 => 'XMP', 1 => 'XMP-ics', 2 => 'Image' },
     1279    NAMESPACE => 'ics',
     1280    NOTES => q{
     1281        Tags used by IDimager.  Nested TagStructure structures are unrolled to an
     1282        arbitrary depth of 6 to avoid infinite recursion.
     1283    },
     1284    ImageRef => { },
     1285    TagStructure => { Struct => \%sTagStruct, List => 'Bag' },
     1286    TagStructureLabelName => { Name => 'LabelName1', Flat => 1 },
     1287    TagStructureReference => { Name => 'Reference1', Flat => 1 },
     1288    TagStructureSubLabels => { Name => 'SubLabels1', Flat => 1 },
     1289    TagStructureParentReference => { Name => 'ParentReference1', Flat => 1 },
     1290    TagStructureSubLabelsLabelName => { Name => 'LabelName2', Flat => 1 },
     1291    TagStructureSubLabelsReference => { Name => 'Reference2', Flat => 1 },
     1292    TagStructureSubLabelsSubLabels => { Name => 'SubLabels2', Flat => 1 },
     1293    TagStructureSubLabelsParentReference => { Name => 'ParentReference2', Flat => 1 },
     1294    TagStructureSubLabelsSubLabelsLabelName => { Name => 'LabelName3', Flat => 1 },
     1295    TagStructureSubLabelsSubLabelsReference => { Name => 'Reference3', Flat => 1 },
     1296    TagStructureSubLabelsSubLabelsSubLabels => { Name => 'SubLabels3', Flat => 1 },
     1297    TagStructureSubLabelsSubLabelsParentReference => { Name => 'ParentReference3', Flat => 1 },
     1298    TagStructureSubLabelsSubLabelsSubLabelsLabelName => { Name => 'LabelName4', Flat => 1 },
     1299    TagStructureSubLabelsSubLabelsSubLabelsReference => { Name => 'Reference4', Flat => 1 },
     1300    TagStructureSubLabelsSubLabelsSubLabelsSubLabels => { Name => 'SubLabels4', Flat => 1 },
     1301    TagStructureSubLabelsSubLabelsSubLabelsParentReference => { Name => 'ParentReference4', Flat => 1 },
     1302    TagStructureSubLabelsSubLabelsSubLabelsSubLabelsLabelName => { Name => 'LabelName5', Flat => 1 },
     1303    TagStructureSubLabelsSubLabelsSubLabelsSubLabelsReference => { Name => 'Reference5', Flat => 1 },
     1304    TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabels => { Name => 'SubLabels5', Flat => 1, NoSubStruct => 1 }, # break infinite recursion
     1305    TagStructureSubLabelsSubLabelsSubLabelsSubLabelsParentReference => { Name => 'ParentReference5', Flat => 1 },
     1306    TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsLabelName => { Name => 'LabelName6', Flat => 1 },
     1307    TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsReference => { Name => 'Reference6', Flat => 1 },
     1308    TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsParentReference => { Name => 'ParentReference6', Flat => 1 },
     1309    SubVersions => { Struct => \%sSubVersion, List => 'Bag' },
     1310    SubVersionsVersRef => { Name => 'SubVersionReference', Flat => 1 },
     1311    SubVersionsFileName => { Name => 'SubVersionFileName', Flat => 1 },
     1312    TimeStamp  => { Avoid => 1, Groups => { 2 => 'Time' }, %dateTimeInfo },
     1313    AppVersion => { Avoid => 1 },
     1314);
     1315
     1316# ACDSee namespace (acdsee) (ref PH)
    8241317%Image::ExifTool::XMP::acdsee = (
    8251318    %xmpTableDefaults,
    8261319    GROUPS => { 0 => 'XMP', 1 => 'XMP-acdsee', 2 => 'Image' },
    8271320    NAMESPACE => 'acdsee',
     1321    AVOID => 1,
    8281322    NOTES => q{
    829         ACD Systems ACDSee schema tags.
     1323        ACD Systems ACDSee namespace tags.
    8301324
    8311325        (A note to software developers: Re-inventing your own private tags instead
    832         of using the equivalent tags in standard XMP schemas defeats one of the most
    833         valuable features of metadata: interoperability.  Your applications mumble
    834         to themselves instead of speaking out for the rest of the world to hear.)
    835     },
    836     author     => { Avoid => 1, Groups => { 2 => 'Author' } },
    837     caption    => { Avoid => 1 },
    838     categories => { Avoid => 1 },
    839     datetime   => { Avoid => 1, Groups => { 2 => 'Time' }, %dateTimeInfo },
    840     keywords   => { Avoid => 1, List => 'Bag' },
    841     notes      => { Avoid => 1 },
    842     rating     => { Avoid => 1, Writable => 'real' }, # integer?
    843     tagged     => { Avoid => 1, Writable => 'boolean' },
     1326        of using the equivalent tags in standard XMP namespaces defeats one of the
     1327        most valuable features of metadata: interoperability.  Your applications
     1328        mumble to themselves instead of speaking out for the rest of the world to
     1329        hear.)
     1330    },
     1331    author     => { Groups => { 2 => 'Author' } },
     1332    caption    => { },
     1333    categories => { },
     1334    collections=> { },
     1335    datetime   => { Name => 'DateTime', Groups => { 2 => 'Time' }, %dateTimeInfo },
     1336    keywords   => { List => 'Bag' },
     1337    notes      => { },
     1338    rating     => { Writable => 'real' }, # integer?
     1339    tagged     => { Writable => 'boolean' },
     1340    rawrppused => { Writable => 'boolean' },
    8441341    rpp => {
    8451342        Name => 'RPP',
     
    8481345        Binary => 1,
    8491346    },
    850 );
    851 
    852 # Picture Licensing Universal System schema properties (xmpPLUS)
     1347    dpp => {
     1348        Name => 'DPP',
     1349        Writable => 'lang-alt',
     1350        Notes => 'newer version of XML raw processing settings',
     1351        Binary => 1,
     1352    },
     1353    # more tags (ref forum6840)
     1354    FixtureIdentifier   => { },
     1355    EditStatus          => { },
     1356    ReleaseDate         => { },
     1357    ReleaseTime         => { },
     1358    OriginatingProgram  => { },
     1359    ObjectCycle         => { },
     1360    Snapshots           => { List => 'Bag', Binary => 1 },
     1361);
     1362
     1363# Picture Licensing Universal System namespace properties (xmpPLUS)
    8531364%Image::ExifTool::XMP::xmpPLUS = (
    8541365    %xmpTableDefaults,
    8551366    GROUPS => { 1 => 'XMP-xmpPLUS', 2 => 'Author' },
    8561367    NAMESPACE => 'xmpPLUS',
    857     NOTES => 'XMP Picture Licensing Universal System (PLUS) schema tags.',
     1368    AVOID => 1,
     1369    NOTES => q{
     1370        XMP Picture Licensing Universal System (PLUS) tags as written by some older
     1371        Adobe applications.  See L<PLUS XMP Tags|Image::ExifTool::TagNames/PLUS XMP Tags>
     1372        for the current PLUS tags.
     1373    },
    8581374    CreditLineReq   => { Writable => 'boolean' },
    8591375    ReuseAllowed    => { Writable => 'boolean' },
    8601376);
    8611377
    862 # Creative Commons schema properties (cc) (ref 5)
     1378# Creative Commons namespace properties (cc) (ref 5)
    8631379%Image::ExifTool::XMP::cc = (
    8641380    %xmpTableDefaults,
     
    8661382    NAMESPACE => 'cc',
    8671383    NOTES => q{
    868         Creative Commons schema tags.  (see
    869         L<http://creativecommons.org/technology/xmp>)
    870     },
    871     license => { },
    872     morePermissions => { },
     1384        Creative Commons namespace tags.  Note that the CC specification for XMP is
     1385        non-existent, so ExifTool must make some assumptions about the format of the
     1386        specific properties in XMP (see L<http://creativecommons.org/ns>).
     1387    },
     1388    # Work properties
     1389    license         => { Resource => 1 },
    8731390    attributionName => { },
    874     attributionURL  => { },
    875 );
    876 
    877 # Description Explorer schema properties (dex) (ref 6)
     1391    attributionURL  => { Resource => 1 },
     1392    morePermissions => { Resource => 1 },
     1393    useGuidelines   => { Resource => 1 },
     1394    # License properties
     1395    permits => {
     1396        List => 'Bag',
     1397        Resource => 1,
     1398        PrintConv => {
     1399            'cc:Sharing' => 'Sharing',
     1400            'cc:DerivativeWorks' => 'Derivative Works',
     1401            'cc:Reproduction' => 'Reproduction',
     1402            'cc:Distribution' => 'Distribution',
     1403        },
     1404    },
     1405    requires => {
     1406        List => 'Bag',
     1407        Resource => 1,
     1408        PrintConv => {
     1409            'cc:Copyleft' => 'Copyleft',
     1410            'cc:LesserCopyleft' => 'Lesser Copyleft',
     1411            'cc:SourceCode' => 'Source Code',
     1412            'cc:ShareAlike' => 'Share Alike',
     1413            'cc:Notice' => 'Notice',
     1414            'cc:Attribution' => 'Attribution',
     1415        },
     1416    },
     1417    prohibits => {
     1418        List => 'Bag',
     1419        Resource => 1,
     1420        PrintConv => {
     1421            'cc:HighIncomeNationUse' => 'High Income Nation Use',
     1422            'cc:CommercialUse' => 'Commercial Use',
     1423        },
     1424    },
     1425    jurisdiction    => { Resource => 1 },
     1426    legalcode       => { Name => 'LegalCode', Resource => 1 },
     1427    deprecatedOn    => { %dateTimeInfo, Groups => { 2 => 'Time' } },
     1428);
     1429
     1430# Description Explorer namespace properties (dex) (ref 6)
    8781431%Image::ExifTool::XMP::dex = (
    8791432    %xmpTableDefaults,
     
    8811434    NAMESPACE => 'dex',
    8821435    NOTES => q{
    883         Description Explorer schema tags.  These tags are not very common.  The
     1436        Description Explorer namespace tags.  These tags are not very common.  The
    8841437        Source and Rating tags are avoided when writing due to name conflicts with
    8851438        other XMP tags.  (see L<http://www.optimasc.com/products/fileid/>)
     
    9101463);
    9111464
    912 # iView MediaPro schema properties (mediapro) (ref PH)
     1465# iView MediaPro namespace properties (mediapro) (ref PH)
    9131466%Image::ExifTool::XMP::MediaPro = (
    9141467    %xmpTableDefaults,
    9151468    GROUPS => { 1 => 'XMP-mediapro', 2 => 'Image' },
    9161469    NAMESPACE => 'mediapro',
    917     NOTES => 'iView MediaPro schema tags.',
    918     Event       => { },
     1470    NOTES => 'iView MediaPro namespace tags.',
     1471    Event       => {
     1472        Avoid => 1,
     1473        Notes => 'avoided due to conflict with XMP-iptcExt:Event',
     1474    },
    9191475    Location    => {
    9201476        Avoid => 1,
     
    9281484);
    9291485
    930 # DigiKam schema tags (ref PH)
     1486# Microsoft ExpressionMedia namespace properties (expressionmedia)
     1487# (ref https://exiftool.org/forum/index.php/topic,4235.0.html)
     1488%Image::ExifTool::XMP::ExpressionMedia = (
     1489    %xmpTableDefaults,
     1490    GROUPS => { 1 => 'XMP-expressionmedia', 2 => 'Image' },
     1491    NAMESPACE => 'expressionmedia',
     1492    AVOID => 1,
     1493    NOTES => q{
     1494        Microsoft Expression Media namespace tags.  These tags are avoided when
     1495        writing due to name conflicts with tags in other schemas.
     1496    },
     1497    Event       => { },
     1498    Status      => { },
     1499    People      => { List => 'Bag' },
     1500    CatalogSets => { List => 'Bag' },
     1501);
     1502
     1503# DigiKam namespace tags (ref PH)
    9311504%Image::ExifTool::XMP::digiKam = (
    9321505    %xmpTableDefaults,
    9331506    GROUPS => { 1 => 'XMP-digiKam', 2 => 'Image' },
    9341507    NAMESPACE => 'digiKam',
    935     NOTES => 'DigiKam schema tags.',
     1508    NOTES => 'DigiKam namespace tags.',
    9361509    CaptionsAuthorNames    => { Writable => 'lang-alt' },
    937     CaptionsDateTimeStamps => { Writable => 'lang-alt' },
     1510    CaptionsDateTimeStamps => { Writable => 'lang-alt', Groups => { 2 => 'Time' } },
    9381511    TagsList               => { List => 'Seq' },
    939 );
    940 
    941 # SWF schema tags (ref PH)
     1512    ColorLabel             => { },
     1513    PickLabel              => { },
     1514    ImageHistory           => { Avoid => 1, Notes => 'different format from EXIF:ImageHistory' },
     1515    LensCorrectionSettings => { },
     1516    ImageUniqueID          => { Avoid => 1 },
     1517);
     1518
     1519# SWF namespace tags (ref PH)
    9421520%Image::ExifTool::XMP::swf = (
    9431521    %xmpTableDefaults,
    9441522    GROUPS => { 1 => 'XMP-swf', 2 => 'Image' },
    9451523    NAMESPACE => 'swf',
    946     NOTES => 'Adobe SWF schema tags.',
     1524    NOTES => 'Adobe SWF namespace tags.',
    9471525    type         => { Avoid => 1 },
    9481526    bgalpha      => { Name => 'BackgroundAlpha', Writable => 'integer' },
     
    9681546);
    9691547
    970 my %sExtensions = (
    971     STRUCT_NAME => 'Extensions',
    972     NAMESPACE   => undef, # variable namespace
     1548# Apple adjustment settings (ref PH)
     1549%Image::ExifTool::XMP::aas = (
     1550    %xmpTableDefaults,
     1551    GROUPS => { 1 => 'XMP-aas', 2 => 'Image' },
     1552    NAMESPACE => 'aas',
     1553    NOTES => 'Apple Adjustment Settings used by iPhone/iPad.',
     1554    CropX      => { Writable => 'integer', Avoid => 1 },
     1555    CropY      => { Writable => 'integer', Avoid => 1 },
     1556    CropW      => { Writable => 'integer', Avoid => 1 },
     1557    CropH      => { Writable => 'integer', Avoid => 1 },
     1558    AffineA    => { Writable => 'real' },
     1559    AffineB    => { Writable => 'real' },
     1560    AffineC    => { Writable => 'real' },
     1561    AffineD    => { Writable => 'real' },
     1562    AffineX    => { Writable => 'real' },
     1563    AffineY    => { Writable => 'real' },
     1564    Vibrance   => { Writable => 'real', Avoid => 1 },
     1565    Curve0x    => { Writable => 'real' },
     1566    Curve0y    => { Writable => 'real' },
     1567    Curve1x    => { Writable => 'real' },
     1568    Curve1y    => { Writable => 'real' },
     1569    Curve2x    => { Writable => 'real' },
     1570    Curve2y    => { Writable => 'real' },
     1571    Curve3x    => { Writable => 'real' },
     1572    Curve3y    => { Writable => 'real' },
     1573    Curve4x    => { Writable => 'real' },
     1574    Curve4y    => { Writable => 'real' },
     1575    Shadows    => { Writable => 'real', Avoid => 1 },
     1576    Highlights => { Writable => 'real', Avoid => 1 },
     1577    # the following from StarGeek
     1578    FaceBalanceOrigI    => { Writable => 'real' },
     1579    FaceBalanceOrigQ    => { Writable => 'real' },
     1580    FaceBalanceStrength => { Writable => 'real' },
     1581    FaceBalanceWarmth   => { Writable => 'real' },
     1582);
     1583
     1584# Adobe creatorAtom properties (ref PH)
     1585%Image::ExifTool::XMP::creatorAtom = (
     1586    %xmpTableDefaults,
     1587    GROUPS => { 1 => 'XMP-creatorAtom', 2 => 'Image' },
     1588    NAMESPACE => 'creatorAtom',
     1589    NOTES => 'Adobe creatorAtom tags, written by After Effects.',
     1590    macAtom => {
     1591        Struct => {
     1592            STRUCT_NAME => 'MacAtom',
     1593            NAMESPACE   => 'creatorAtom',
     1594            applicationCode      => { },
     1595            invocationAppleEvent => { },
     1596            posixProjectPath     => { },
     1597        },
     1598    },
     1599    windowsAtom => {
     1600        Struct => {
     1601            STRUCT_NAME => 'WindowsAtom',
     1602            NAMESPACE   => 'creatorAtom',
     1603            extension       => { },
     1604            invocationFlags => { },
     1605            uncProjectPath  => { },
     1606        },
     1607    },
     1608    aeProjectLink => { # (After Effects Project Link)
     1609        Struct => {
     1610            STRUCT_NAME => 'AEProjectLink',
     1611            NAMESPACE   => 'creatorAtom',
     1612            renderTimeStamp         => { Writable => 'integer' },
     1613            compositionID           => { },
     1614            renderQueueItemID       => { },
     1615            renderOutputModuleIndex => { },
     1616            fullPath                => { },
     1617        },
     1618    },
     1619);
     1620
     1621# FastPictureViewer namespace properties (http://www.fastpictureviewer.com/help/#rtfcomments)
     1622%Image::ExifTool::XMP::fpv = (
     1623    %xmpTableDefaults,
     1624    GROUPS => { 1 => 'XMP-fpv', 2 => 'Image' },
     1625    NAMESPACE => 'fpv',
    9731626    NOTES => q{
    974         This structure may contain any top-level XMP tags, but none have been
    975         pre-defined in ExifTool.  Without pre-defined flattened tag names,
    976         RegionExtensions may be written only as a structure (ie.
    977         C<{xmp-dc:creator=me,rating=5}>).  Fields for this structure are identified
    978         using the standard ExifTool tag name (with optional leading group name,
    979         and/or trailing language code, and/or trailing C<#> symbol to disable print
    980         conversion).
    981     },
    982 );
    983 my %sRegionStruct = (
    984     STRUCT_NAME => 'RegionStruct',
    985     NAMESPACE   => 'mwg-rs',
    986     Area => { Struct => \%sArea },
    987     Type => {
    988         PrintConv => {
    989             Face => 'Face',
    990             Pet => 'Pet',
    991             Focus => 'Focus',
    992             BarCode => 'BarCode',
    993         },
    994     },
    995     Name        => { },
    996     Description => { },
    997     FocusUsage  => {
    998         PrintConv => {
    999             EvaluatedUsed => 'Evaluated, Used',
    1000             EvaluatedNotUsed => 'Evaluated, Not Used',
    1001             NotEvaluatedNotUsed => 'Not Evaluated, Not Used',
    1002         },
    1003     },
    1004     BarCodeValue=> { },
    1005     Extensions  => { Struct => \%sExtensions },
    1006     seeAlso => { Namespace => 'rdfs', Resource => 1 },
    1007 );
    1008 my %sKeywordStruct4 = (
    1009     STRUCT_NAME => 'KeywordStruct4',
    1010     NAMESPACE   => 'mwg-kw',
    1011     Keyword   => { },
    1012     Applied   => { Writable => 'boolean' },
    1013 );
    1014 my %sKeywordStruct3 = (
    1015     STRUCT_NAME => 'KeywordStruct3',
    1016     NAMESPACE   => 'mwg-kw',
    1017     Keyword   => { },
    1018     Applied   => { Writable => 'boolean' },
    1019     Children  => { Struct => \%sKeywordStruct4, List => 'Bag' },
    1020 );
    1021 my %sKeywordStruct2 = (
    1022     STRUCT_NAME => 'KeywordStruct2',
    1023     NAMESPACE   => 'mwg-kw',
    1024     Keyword   => { },
    1025     Applied   => { Writable => 'boolean' },
    1026     Children  => { Struct => \%sKeywordStruct3, List => 'Bag' },
    1027 );
    1028 my %sKeywordStruct1 = (
    1029     STRUCT_NAME => 'KeywordStruct1',
    1030     NAMESPACE   => 'mwg-kw',
    1031     Keyword   => { },
    1032     Applied   => { Writable => 'boolean' },
    1033     Children  => { Struct => \%sKeywordStruct2, List => 'Bag' },
    1034 );
    1035 
    1036 # MWG 2.0 region schema tags
    1037 %Image::ExifTool::XMP::mwg_rs = (
    1038     %xmpTableDefaults,
    1039     GROUPS => { 1 => 'XMP-mwg-rs', 2 => 'Image' },
    1040     NAMESPACE => 'mwg-rs',
     1627        Fast Picture Viewer tags (see
     1628        L<http://www.fastpictureviewer.com/help/#rtfcomments>).
     1629    },
     1630    RichTextComment => { },
     1631);
     1632
     1633# Apple FaceInfo namespace properties (ref PH)
     1634%Image::ExifTool::XMP::apple_fi = (
     1635    %xmpTableDefaults,
     1636    GROUPS => { 1 => 'XMP-apple-fi', 2 => 'Image' },
     1637    NAMESPACE => 'apple-fi',
    10411638    NOTES => q{
    1042         Image region metadata defined by the MWG 2.0 specification.  See
    1043         L<http://www.metadataworkinggroup.org/> for the official specification.
    1044     },
    1045     Regions => {
    1046         Name => 'RegionInfo',
    1047         Struct => {
    1048             STRUCT_NAME => 'RegionInfo',
    1049             NAMESPACE   => 'mwg-rs',
    1050             RegionList => { Struct => \%sRegionStruct, List => 'Bag' },
    1051             AppliedToDimensions => { Struct => \%sDimensions },
    1052         },
    1053     },
    1054     RegionsAppliedToDimensions  => { Flat => 1, Name => 'RegionAppliedToDimensions' },
    1055     RegionsAppliedToDimensionsW => { Flat => 1, Name => 'RegionAppliedToDimensionsW' },
    1056     RegionsAppliedToDimensionsH => { Flat => 1, Name => 'RegionAppliedToDimensionsH' },
    1057     RegionsAppliedToDimensionsUnit=>{Flat => 1, Name => 'RegionAppliedToDimensionsUnit' },
    1058     RegionsRegionList           => { Flat => 1, Name => 'RegionList' },
    1059     RegionsRegionListArea       => { Flat => 1, Name => 'RegionArea' },
    1060     RegionsRegionListAreaX      => { Flat => 1, Name => 'RegionAreaX' },
    1061     RegionsRegionListAreaY      => { Flat => 1, Name => 'RegionAreaY' },
    1062     RegionsRegionListAreaW      => { Flat => 1, Name => 'RegionAreaW' },
    1063     RegionsRegionListAreaH      => { Flat => 1, Name => 'RegionAreaH' },
    1064     RegionsRegionListAreaD      => { Flat => 1, Name => 'RegionAreaD' },
    1065     RegionsRegionListAreaUnit   => { Flat => 1, Name => 'RegionAreaUnit' },
    1066     RegionsRegionListType       => { Flat => 1, Name => 'RegionType' },
    1067     RegionsRegionListName       => { Flat => 1, Name => 'RegionName' },
    1068     RegionsRegionListDescription=> { Flat => 1, Name => 'RegionDescription' },
    1069     RegionsRegionListFocusUsage => { Flat => 1, Name => 'RegionFocusUsage' },
    1070     RegionsRegionListBarCodeValue=>{ Flat => 1, Name => 'RegionBarCodeValue' },
    1071     RegionsRegionListExtensions => { Flat => 1, Name => 'RegionExtensions' },
    1072     RegionsRegionListSeeAlso    => { Flat => 1, Name => 'RegionSeeAlso' },
    1073 );
    1074 
    1075 # MWG 2.0 hierarchical keyword schema tags
    1076 %Image::ExifTool::XMP::mwg_kw = (
    1077     %xmpTableDefaults,
    1078     GROUPS => { 1 => 'XMP-mwg-kw', 2 => 'Image' },
    1079     NAMESPACE => 'mwg-kw',
     1639        Face information tags written by the Apple iPhone 5 inside the mwg-rs
     1640        RegionExtensions.
     1641    },
     1642    Timestamp => {
     1643        Name => 'TimeStamp',
     1644        Writable => 'integer',
     1645        # (don't know how to convert this)
     1646    },
     1647    FaceID          => { Writable => 'integer' },
     1648    AngleInfoRoll   => { Writable => 'integer' },
     1649    AngleInfoYaw    => { Writable => 'integer' },
     1650    ConfidenceLevel => { Writable => 'integer' },
     1651);
     1652
     1653# Google audio namespace
     1654%Image::ExifTool::XMP::GAudio = (
     1655    %xmpTableDefaults,
     1656    GROUPS => { 1 => 'XMP-GAudio', 2 => 'Audio' },
     1657    NAMESPACE => 'GAudio',
     1658    Data => {
     1659        Name => 'AudioData',
     1660        ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
     1661        ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)',
     1662    },
     1663    Mime => { Name => 'AudioMimeType' },
     1664);
     1665
     1666# Google image namespace
     1667%Image::ExifTool::XMP::GImage = (
     1668    %xmpTableDefaults,
     1669    GROUPS => { 1 => 'XMP-GImage', 2 => 'Image' },
     1670    NAMESPACE => 'GImage',
     1671    Data => {
     1672        Name => 'ImageData',
     1673        ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
     1674        ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)',
     1675    },
     1676    Mime => { Name => 'ImageMimeType' },
     1677);
     1678
     1679# Google panorama namespace properties
     1680# (ref https://exiftool.org/forum/index.php/topic,4569.0.html)
     1681%Image::ExifTool::XMP::GPano = (
     1682    %xmpTableDefaults,
     1683    GROUPS => { 1 => 'XMP-GPano', 2 => 'Image' },
     1684    NAMESPACE => 'GPano',
    10801685    NOTES => q{
    1081         Hierarchical keywords metadata defined by the MWG 2.0 specification.
    1082         ExifTool unrolls keyword structures to an arbitrary depth of 4 to allow
    1083         individual levels to be accessed with different tag names, and to avoid
    1084         infinite recursion.  See L<http://www.metadataworkinggroup.org/> for the
    1085         official specification.
    1086     },
    1087     # arbitrarily define only the first 4 levels of the keyword hierarchy
    1088     Keywords => {
    1089         Name => 'KeywordInfo',
    1090         Struct => {
    1091             STRUCT_NAME => 'KeywordInfo',
    1092             NAMESPACE   => 'mwg-kw',
    1093             Hierarchy => { Struct => \%sKeywordStruct1, List => 'Bag' },
    1094         },
    1095     },
    1096     KeywordsHierarchy => { Name => 'HierarchicalKeywords', Flat => 1 },
    1097     KeywordsHierarchyKeyword  => { Name => 'HierarchicalKeywords1', Flat => 1 },
    1098     KeywordsHierarchyApplied  => { Name => 'HierarchicalKeywords1Applied', Flat => 1 },
    1099     KeywordsHierarchyChildren => { Name => 'HierarchicalKeywords1Children', Flat => 1 },
    1100     KeywordsHierarchyChildrenKeyword  => { Name => 'HierarchicalKeywords2', Flat => 1 },
    1101     KeywordsHierarchyChildrenApplied  => { Name => 'HierarchicalKeywords2Applied', Flat => 1 },
    1102     KeywordsHierarchyChildrenChildren => { Name => 'HierarchicalKeywords2Children', Flat => 1 },
    1103     KeywordsHierarchyChildrenChildrenKeyword  => { Name => 'HierarchicalKeywords3', Flat => 1 },
    1104     KeywordsHierarchyChildrenChildrenApplied  => { Name => 'HierarchicalKeywords3Applied', Flat => 1 },
    1105     KeywordsHierarchyChildrenChildrenChildren => { Name => 'HierarchicalKeywords3Children', Flat => 1 },
    1106     KeywordsHierarchyChildrenChildrenChildrenKeyword => { Name => 'HierarchicalKeywords4', Flat => 1 },
    1107     KeywordsHierarchyChildrenChildrenChildrenApplied => { Name => 'HierarchicalKeywords4Applied', Flat => 1 },
    1108 );
    1109 
    1110 # MWG 2.0 collections schema tags
    1111 %Image::ExifTool::XMP::mwg_coll = (
    1112     %xmpTableDefaults,
    1113     GROUPS => { 1 => 'XMP-mwg-coll', 2 => 'Image' },
    1114     NAMESPACE => 'mwg-coll',
     1686        Panorama tags written by Google Photosphere. See
     1687        L<https://developers.google.com/panorama/metadata/> for the specification.
     1688    },
     1689    UsePanoramaViewer               => { Writable => 'boolean' },
     1690    CaptureSoftware                 => { },
     1691    StitchingSoftware               => { },
     1692    ProjectionType                  => { },
     1693    PoseHeadingDegrees              => { Writable => 'real' },
     1694    PosePitchDegrees                => { Writable => 'real' },
     1695    PoseRollDegrees                 => { Writable => 'real' },
     1696    InitialViewHeadingDegrees       => { Writable => 'real' },
     1697    InitialViewPitchDegrees         => { Writable => 'real' },
     1698    InitialViewRollDegrees          => { Writable => 'real' },
     1699    InitialHorizontalFOVDegrees     => { Writable => 'real' },
     1700    InitialVerticalFOVDegrees       => { Writable => 'real' },
     1701    FirstPhotoDate                  => { %dateTimeInfo, Groups => { 2 => 'Time' } },
     1702    LastPhotoDate                   => { %dateTimeInfo, Groups => { 2 => 'Time' } },
     1703    SourcePhotosCount               => { Writable => 'integer' },
     1704    ExposureLockUsed                => { Writable => 'boolean' },
     1705    CroppedAreaImageWidthPixels     => { Writable => 'real' },
     1706    CroppedAreaImageHeightPixels    => { Writable => 'real' },
     1707    FullPanoWidthPixels             => { Writable => 'real' },
     1708    FullPanoHeightPixels            => { Writable => 'real' },
     1709    CroppedAreaLeftPixels           => { Writable => 'real' },
     1710    CroppedAreaTopPixels            => { Writable => 'real' },
     1711    InitialCameraDolly              => { Writable => 'real' },
     1712    # (the following have been observed, but are not in the specification)
     1713    LargestValidInteriorRectLeft    => { Writable => 'real' },
     1714    LargestValidInteriorRectTop     => { Writable => 'real' },
     1715    LargestValidInteriorRectWidth   => { Writable => 'real' },
     1716    LargestValidInteriorRectHeight  => { Writable => 'real' },
     1717);
     1718
     1719# Google Spherical Images namespace (ref https://github.com/google/spatial-media/blob/master/docs/spherical-video-rfc.md)
     1720%Image::ExifTool::XMP::GSpherical = (
     1721    %xmpTableDefaults,
     1722    GROUPS => { 1 => 'XMP-GSpherical', 2 => 'Image' },
     1723    WRITE_GROUP => 'GSpherical', # write in special location for video files
     1724    NAMESPACE => 'GSpherical',
     1725    AVOID => 1,
    11151726    NOTES => q{
    1116         Collections metadata defined by the MWG 2.0 specification.  See
    1117         L<http://www.metadataworkinggroup.org/> for the official specification.
    1118     },
    1119     Collections => {
    1120         List => 'Bag',
    1121         Struct => {
    1122             STRUCT_NAME => 'CollectionInfo',
    1123             NAMESPACE   => 'mwg-coll',
    1124             CollectionName => { },
    1125             CollectionURI  => { },
    1126         },
    1127     },
    1128     CollectionsCollectionName => { Name => 'CollectionName', Flat => 1 },
    1129     CollectionsCollectionURI  => { Name => 'CollectionURI',  Flat => 1 },
    1130 );
    1131 
    1132 # SVG schema properties (ref 9)
     1727        Not actually XMP.  These RDF/XML tags are used in Google spherical MP4
     1728        videos.  These tags are written into the video track of MOV/MP4 files, and
     1729        not at the top level like other XMP tags.  See
     1730        L<https://github.com/google/spatial-media/blob/master/docs/spherical-video-rfc.md>
     1731        for the specification.
     1732    },
     1733    # (avoid due to conflicts with XMP-GPano tags)
     1734    Spherical                   => { Writable => 'boolean' },
     1735    Stitched                    => { Writable => 'boolean' },
     1736    StitchingSoftware           => { },
     1737    ProjectionType              => { },
     1738    StereoMode                  => { },
     1739    SourceCount                 => { Writable => 'integer' },
     1740    InitialViewHeadingDegrees   => { Writable => 'real' },
     1741    InitialViewPitchDegrees     => { Writable => 'real' },
     1742    InitialViewRollDegrees      => { Writable => 'real' },
     1743    Timestamp                   => {
     1744        Name => 'TimeStamp',
     1745        Groups => { 2 => 'Time' },
     1746        Writable => 'integer',
     1747        Shift => 'Time',
     1748        ValueConv => 'ConvertUnixTime($val)', #(NC)
     1749        ValueConvInv => 'GetUnixTime($val)',
     1750        PrintConv => '$self->ConvertDateTime($val)',
     1751        PrintConvInv => '$self->InverseDateTime($val)',
     1752    },
     1753    FullPanoWidthPixels         => { Writable => 'integer' },
     1754    FullPanoHeightPixels        => { Writable => 'integer' },
     1755    CroppedAreaImageWidthPixels => { Writable => 'integer' },
     1756    CroppedAreaImageHeightPixels=> { Writable => 'integer' },
     1757    CroppedAreaLeftPixels       => { Writable => 'integer' },
     1758    CroppedAreaTopPixels        => { Writable => 'integer' },
     1759);
     1760
     1761# Google depthmap information (ref https://developers.google.com/depthmap-metadata/reference)
     1762%Image::ExifTool::XMP::GDepth = (
     1763    GROUPS      => { 0 => 'XMP', 1 => 'XMP-GDepth', 2 => 'Image' },
     1764    NAMESPACE   => 'GDepth',
     1765    AVOID       => 1, # (too many potential tag name conflicts)
     1766    NOTES       => q{
     1767        Google depthmap information. See
     1768        L<https://developers.google.com/depthmap-metadata/> for the specification.
     1769    },
     1770    WRITABLE    => 'string', # (default to string-type tags)
     1771    PRIORITY    => 0,
     1772    Format => {
     1773        PrintConv => {
     1774            RangeInverse => 'RangeInverse',
     1775            RangeLinear  => 'RangeLinear',
     1776        },
     1777    },
     1778    Near        => { Writable => 'real' },
     1779    Far         => { Writable => 'real' },
     1780    Mime        => { },
     1781    Data => {
     1782        Name => 'DepthImage',
     1783        ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
     1784        ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)',
     1785    },
     1786    Units       => { },
     1787    MeasureType => {
     1788        PrintConv => {
     1789            OpticalAxis => 'OpticalAxis',
     1790            OpticalRay  => 'OpticalRay',
     1791        },
     1792    },
     1793    ConfidenceMime  => { },
     1794    Confidence => {
     1795        ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
     1796        ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)',
     1797    },
     1798    Manufacturer=> { },
     1799    Model       => { },
     1800    Software    => { },
     1801    ImageWidth  => { Writable => 'real' },
     1802    ImageHeight => { Writable => 'real' },
     1803);
     1804
     1805# Google focus namespace
     1806%Image::ExifTool::XMP::GFocus = (
     1807    %xmpTableDefaults,
     1808    GROUPS => { 1 => 'XMP-GFocus', 2 => 'Image' },
     1809    NAMESPACE => 'GFocus',
     1810    NOTES => 'Focus information found in Google depthmap images.',
     1811    BlurAtInfinity  => { Writable => 'real' },
     1812    FocalDistance   => { Writable => 'real' },
     1813    FocalPointX     => { Writable => 'real' },
     1814    FocalPointY     => { Writable => 'real' },
     1815);
     1816
     1817# Google camera namespace (ref PH)
     1818%Image::ExifTool::XMP::GCamera = (
     1819    %xmpTableDefaults,
     1820    GROUPS => { 1 => 'XMP-GCamera', 2 => 'Camera' },
     1821    NAMESPACE => 'GCamera',
     1822    NOTES => 'Camera information found in Google panorama images.',
     1823    BurstID         => { },
     1824    BurstPrimary    => { },
     1825    PortraitNote    => { },
     1826    PortraitRequest => {
     1827        Notes => 'High Definition Render Pipeline (HDRP) data', #PH (guess)
     1828        ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
     1829        ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)',
     1830    },
     1831    PortraitVersion => { },
     1832    SpecialTypeID   => { List => 'Bag' },
     1833    PortraitNote    => { },
     1834    DisableAutoCreation => { List => 'Bag' },
     1835    hdrp_makernote => {
     1836        Name => 'HDRPMakerNote',
     1837        # decoded data starts with the following bytes, but nothing yet is known about its contents:
     1838        # 48 44 52 50 02 ef 64 35 6d 5e 70 1e 2c ea e3 4c [HDRP..d5m^p.,..L]
     1839        ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
     1840        ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)',
     1841    },
     1842    MicroVideo          => { Writable => 'integer' },
     1843    MicroVideoVersion   => { Writable => 'integer' },
     1844    MicroVideoOffset    => { Writable => 'integer' },
     1845    MicroVideoPresentationTimestampUs => { Writable => 'integer' },
     1846);
     1847
     1848# Google creations namespace (ref PH)
     1849%Image::ExifTool::XMP::GCreations = (
     1850    %xmpTableDefaults,
     1851    GROUPS => { 1 => 'XMP-GCreations', 2 => 'Camera' },
     1852    NAMESPACE => 'GCreations',
     1853    NOTES => 'Google creations tags.',
     1854    CameraBurstID  => { },
     1855);
     1856
     1857# Google depth-map Device namespace (ref 13)
     1858%Image::ExifTool::XMP::Device = (
     1859    %xmpTableDefaults,
     1860    GROUPS => { 1 => 'XMP-Device', 2 => 'Camera' },
     1861    NAMESPACE => { Device => 'http://ns.google.com/photos/dd/1.0/device/' },
     1862    NOTES => q{
     1863        Google depth-map Device tags.  See
     1864        L<https://developer.android.com/training/camera2/Dynamic-depth-v1.0.pdf> for
     1865        the specification.
     1866    },
     1867    Container => {
     1868        Struct => {
     1869            STRUCT_NAME => 'DeviceContainer',
     1870            NAMESPACE   => { Container => 'http://ns.google.com/photos/dd/1.0/container/' },
     1871            Directory => {
     1872                List => 'Seq',
     1873                Struct => {
     1874                    STRUCT_NAME => 'DeviceDirectory',
     1875                    NAMESPACE   => { Container => 'http://ns.google.com/photos/dd/1.0/container/' },
     1876                    Item => {
     1877                        Struct => {
     1878                            STRUCT_NAME => 'DeviceItem',
     1879                            NAMESPACE => { Item => 'http://ns.google.com/photos/dd/1.0/item/' },
     1880                            Mime    => { },
     1881                            Length  => { Writable => 'integer' },
     1882                            Padding => { Writable => 'integer' },
     1883                            DataURI => { },
     1884                        },
     1885                    },
     1886                },
     1887            }
     1888        },
     1889    },
     1890    Profiles => {
     1891        List => 'Seq',
     1892        FlatName => '',
     1893        Struct => {
     1894            STRUCT_NAME => 'DeviceProfiles',
     1895            NAMESPACE => { Device => 'http://ns.google.com/photos/dd/1.0/device/' },
     1896            Profile => {
     1897                Struct => {
     1898                    STRUCT_NAME => 'DeviceProfile',
     1899                    NAMESPACE => { Profile => 'http://ns.google.com/photos/dd/1.0/profile/' },
     1900                    CameraIndices => { List => 'Seq', Writable => 'integer' },
     1901                    Type => { },
     1902                },
     1903            },
     1904        },
     1905    },
     1906    Cameras => {
     1907        List => 'Seq',
     1908        FlatName => '',
     1909        Struct => {
     1910            STRUCT_NAME => 'DeviceCameras',
     1911            NAMESPACE => { Device => 'http://ns.google.com/photos/dd/1.0/device/' },
     1912            Camera => {
     1913                Struct => {
     1914                    STRUCT_NAME => 'DeviceCamera',
     1915                    NAMESPACE => { Camera => 'http://ns.google.com/photos/dd/1.0/camera/' },
     1916                    DepthMap => {
     1917                        Struct => {
     1918                            STRUCT_NAME => 'DeviceDepthMap',
     1919                            NAMESPACE => { DepthMap => 'http://ns.google.com/photos/dd/1.0/depthmap/' },
     1920                            ConfidenceURI => { },
     1921                            DepthURI    => { },
     1922                            Far         => { Writable => 'real' },
     1923                            Format      => { },
     1924                            ItemSemantic=> { },
     1925                            MeasureType => { },
     1926                            Near        => { Writable => 'real' },
     1927                            Units       => { },
     1928                            Software    => { },
     1929                            FocalTableEntryCount => { Writable => 'integer' },
     1930                            FocalTable  => { }, # (base64)
     1931                        },
     1932                    },
     1933                    Image => {
     1934                        Struct => {
     1935                            STRUCT_NAME => 'DeviceImage',
     1936                            NAMESPACE => { Image => 'http://ns.google.com/photos/dd/1.0/image/' },
     1937                            ItemSemantic=> { },
     1938                            ItemURI     => { },
     1939                        },
     1940                    },
     1941                    ImagingModel => {
     1942                        Struct => {
     1943                            STRUCT_NAME => 'DeviceImagingModel',
     1944                            NAMESPACE => { ImagingModel => 'http://ns.google.com/photos/dd/1.0/imagingmodel/' },
     1945                            Distortion      => { }, # (base64)
     1946                            DistortionCount => { Writable => 'integer' },
     1947                            FocalLengthX    => { Writable => 'real' },
     1948                            FocalLengthY    => { Writable => 'real' },
     1949                            ImageHeight     => { Writable => 'integer' },
     1950                            ImageWidth      => { Writable => 'integer' },
     1951                            PixelAspectRatio=> { Writable => 'real' },
     1952                            PrincipalPointX => { Writable => 'real' },
     1953                            PrincipalPointY => { Writable => 'real' },
     1954                            Skew            => { Writable => 'real' },
     1955                        },
     1956                    },
     1957                    PointCloud => {
     1958                        Struct => {
     1959                            STRUCT_NAME => 'DevicePointCloud',
     1960                            NAMESPACE => { PointCloud => 'http://ns.google.com/photos/dd/1.0/pointcloud/' },
     1961                            PointCloud  => { Writable => 'integer' },
     1962                            Points      => { },
     1963                            Metric      => { Writable => 'boolean' },
     1964                        },
     1965                    },
     1966                    Pose => { Struct => \%sPose },
     1967                    LightEstimate => {
     1968                        Struct => {
     1969                            STRUCT_NAME => 'DeviceLightEstimate',
     1970                            NAMESPACE => { LightEstimate => 'http://ns.google.com/photos/dd/1.0/lightestimate/' },
     1971                            ColorCorrectionR => { Writable => 'real' },
     1972                            ColorCorrectionG => { Writable => 'real' },
     1973                            ColorCorrectionB => { Writable => 'real' },
     1974                            PixelIntensity   => { Writable => 'real' },
     1975                        },
     1976                    },
     1977                    VendorInfo => { Struct => \%sVendorInfo },
     1978                    AppInfo    => { Struct => \%sAppInfo },
     1979                    Trait => { },
     1980                },
     1981            },
     1982        },
     1983    },
     1984    VendorInfo  => { Struct => \%sVendorInfo },
     1985    AppInfo     => { Struct => \%sAppInfo },
     1986    EarthPos    => { Struct => \%sEarthPose },
     1987    Pose        => { Struct => \%sPose },
     1988    Planes => {
     1989        List => 'Seq',
     1990        FlatName => '',
     1991        Struct => {
     1992            STRUCT_NAME => 'DevicePlanes',
     1993            NAMESPACE => { Device => 'http://ns.google.com/photos/dd/1.0/device/' },
     1994            Plane => {
     1995                Struct => {
     1996                    STRUCT_NAME => 'DevicePlane',
     1997                    NAMESPACE => { Plane => 'http://ns.google.com/photos/dd/1.0/plane/' },
     1998                    Pose    => { Struct => \%sPose },
     1999                    ExtentX => { Writable => 'real' },
     2000                    ExtentZ => { Writable => 'real' },
     2001                    BoundaryVertexCount => { Writable => 'integer' },
     2002                    Boundary => { },
     2003                },
     2004            },
     2005        },
     2006    },
     2007);
     2008
     2009# Getty Images namespace (ref PH)
     2010%Image::ExifTool::XMP::GettyImages = (
     2011    %xmpTableDefaults,
     2012    GROUPS => { 1 => 'XMP-getty', 2 => 'Image' },
     2013    NAMESPACE => 'GettyImagesGIFT',
     2014    NOTES => q{
     2015        The actual Getty Images namespace prefix is "GettyImagesGIFT", which is the
     2016        prefix recorded in the file, but ExifTool shortens this for the family 1
     2017        group name.
     2018    },
     2019    Personality         => { List => 'Bag' },
     2020    OriginalFilename    => { Name => 'OriginalFileName' },
     2021    ParentMEID          => { },
     2022    # the following from StarGeek
     2023    AssetID             => { },
     2024    CallForImage        => { },
     2025    CameraFilename      => { },
     2026    CameraMakeModel     => { Avoid => 1 },
     2027    Composition         => { },
     2028    CameraSerialNumber  => { Avoid => 1 },
     2029    ExclusiveCoverage   => { },
     2030    GIFTFtpPriority     => { },
     2031    ImageRank           => { },
     2032    MediaEventIdDate    => { },
     2033    OriginalCreateDateTime => { %dateTimeInfo, Groups => { 2 => 'Time' }, Avoid => 1 },
     2034    ParentMediaEventID  => { },
     2035    PrimaryFTP          => { List => 'Bag' },
     2036    RoutingDestinations => { List => 'Bag' },
     2037    RoutingExclusions   => { List => 'Bag' },
     2038    SecondaryFTP        => { List => 'Bag' },
     2039    TimeShot            => { },
     2040);
     2041
     2042# RED smartphone images (ref PH)
     2043%Image::ExifTool::XMP::LImage = (
     2044    %xmpTableDefaults,
     2045    GROUPS => { 1 => 'XMP-LImage', 2 => 'Image' },
     2046    NAMESPACE => 'LImage',
     2047    NOTES => 'Tags written by RED smartphones.',
     2048    MajorVersion => { },
     2049    MinorVersion => { },
     2050    RightAlbedo => {
     2051        Notes => 'Right stereoscopic image',
     2052        Groups => { 2 => 'Preview' },
     2053        ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
     2054        ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)',
     2055    },
     2056);
     2057
     2058# SVG namespace properties (ref 9)
    11332059%Image::ExifTool::XMP::SVG = (
    11342060    GROUPS => { 0 => 'SVG', 1 => 'SVG', 2 => 'Image' },
     
    11452071    id         => 'ID',
    11462072    metadataId => 'MetadataID',
    1147     width      => 'ImageWidth',
    1148     height     => 'ImageHeight',
     2073    width      => {
     2074        Name => 'ImageWidth',
     2075        ValueConv => '$val =~ s/px$//; $val',
     2076    },
     2077    height     => {
     2078        Name => 'ImageHeight',
     2079        ValueConv => '$val =~ s/px$//; $val',
     2080    },
    11492081);
    11502082
     
    11562088);
    11572089
    1158 # set "Avoid" flag for all PRISM tags
    1159 my ($table, $key);
    1160 foreach $table (
    1161     \%Image::ExifTool::XMP::prism,
    1162     \%Image::ExifTool::XMP::prl,
    1163     \%Image::ExifTool::XMP::pur)
     2090#------------------------------------------------------------------------------
     2091# Generate crd tags
     2092# Inputs: 0) tag table ref
     2093sub Init_crd($)
    11642094{
    1165     foreach $key (TagTableKeys($table)) {
    1166         $table->{$key}->{Avoid} = 1;
     2095    my $tagTablePtr = shift;
     2096    # import tags from CRS namespace
     2097    my $crsTable = GetTagTable('Image::ExifTool::XMP::crs');
     2098    my $tag;
     2099    foreach $tag (Image::ExifTool::TagTableKeys($crsTable)) {
     2100        my $crsInfo = $$crsTable{$tag};
     2101        my $tagInfo = $$tagTablePtr{$tag} = { %$crsInfo };
     2102        $$tagInfo{Groups} = { 0 => 'XMP', 1 => 'XMP-crd' , 2 => $$crsInfo{Groups}{2} } if $$crsInfo{Groups};
    11672103    }
    11682104}
     
    11752111=head1 NAME
    11762112
    1177 Image::ExifTool::XMP2.pl - Additional XMP schema definitions
     2113Image::ExifTool::XMP2.pl - Additional XMP namespace definitions
    11782114
    11792115=head1 SYNOPSIS
     
    11832119=head1 DESCRIPTION
    11842120
    1185 This file contains definitions for less common XMP schemas.
     2121This file contains definitions for less common XMP namespaces.
    11862122
    11872123=head1 AUTHOR
    11882124
    1189 Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
     2125Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
    11902126
    11912127This library is free software; you can redistribute it and/or modify it
     
    12022138=item L<http://www.portfoliofaq.com/pfaq/v7mappings.htm>
    12032139
     2140=item L<http://www.iptc.org/IPTC4XMP/>
     2141
    12042142=item L<http://creativecommons.org/technology/xmp>
    12052143
Note: See TracChangeset for help on using the changeset viewer.