XMP2.pl 55 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582
  1. #------------------------------------------------------------------------------
  2. # File: XMP2.pl
  3. #
  4. # Description: Additional XMP namespace definitions
  5. #
  6. # Revisions: 10/12/2008 - P. Harvey Created
  7. #
  8. # References: 1) PLUS - http://ns.useplus.org/
  9. # 2) PRISM - http://www.prismstandard.org/
  10. # 3) http://www.portfoliofaq.com/pfaq/v7mappings.htm
  11. # 5) http://creativecommons.org/technology/xmp
  12. # --> changed to http://wiki.creativecommons.org/Companion_File_metadata_specification (2007/12/21)
  13. # 6) http://www.optimasc.com/products/fileid/xmp-extensions.pdf
  14. # 9) http://www.w3.org/TR/SVG11/
  15. # 11) http://www.extensis.com/en/support/kb_article.jsp?articleNumber=6102211
  16. # 12) XMPSpecificationPart3_May2013, page 58
  17. #------------------------------------------------------------------------------
  18. package Image::ExifTool::XMP;
  19. use strict;
  20. use Image::ExifTool qw(:Utils);
  21. use Image::ExifTool::XMP;
  22. # xmpDM structure definitions
  23. my %sCuePointParam = (
  24. STRUCT_NAME => 'CuePointParam',
  25. NAMESPACE => 'xmpDM',
  26. key => { },
  27. value => { },
  28. );
  29. my %sMarker = (
  30. STRUCT_NAME => 'Marker',
  31. NAMESPACE => 'xmpDM',
  32. comment => { },
  33. duration => { },
  34. location => { },
  35. name => { },
  36. startTime => { },
  37. target => { },
  38. type => { },
  39. # added Oct 2008
  40. cuePointParams => { Struct => \%sCuePointParam, List => 'Seq' },
  41. cuePointType=> { },
  42. probability => { Writable => 'real' },
  43. speaker => { },
  44. );
  45. my %sTime = (
  46. STRUCT_NAME => 'Time',
  47. NAMESPACE => 'xmpDM',
  48. scale => { Writable => 'rational' },
  49. value => { Writable => 'integer' },
  50. );
  51. my %sTimecode = (
  52. STRUCT_NAME => 'Timecode',
  53. NAMESPACE => 'xmpDM',
  54. timeFormat => {
  55. PrintConv => {
  56. '24Timecode' => '24 fps',
  57. '25Timecode' => '25 fps',
  58. '2997DropTimecode' => '29.97 fps (drop)',
  59. '2997NonDropTimecode' => '29.97 fps (non-drop)',
  60. '30Timecode' => '30 fps',
  61. '50Timecode' => '50 fps',
  62. '5994DropTimecode' => '59.94 fps (drop)',
  63. '5994NonDropTimecode' => '59.94 fps (non-drop)',
  64. '60Timecode' => '60 fps',
  65. '23976Timecode' => '23.976 fps',
  66. },
  67. },
  68. timeValue => { },
  69. value => { Writable => 'integer' },
  70. );
  71. # XMP Dynamic Media namespace properties (xmpDM)
  72. %Image::ExifTool::XMP::xmpDM = (
  73. %xmpTableDefaults,
  74. GROUPS => { 1 => 'XMP-xmpDM', 2 => 'Image' },
  75. NAMESPACE => 'xmpDM',
  76. NOTES => 'XMP Dynamic Media namespace tags.',
  77. absPeakAudioFilePath=> { },
  78. album => { },
  79. altTapeName => { },
  80. altTimecode => { Struct => \%sTimecode },
  81. artist => { Avoid => 1, Groups => { 2 => 'Author' } },
  82. audioModDate => { Groups => { 2 => 'Time' }, %dateTimeInfo },
  83. audioSampleRate => { Writable => 'integer' },
  84. audioSampleType => {
  85. PrintConv => {
  86. '8Int' => '8-bit integer',
  87. '16Int' => '16-bit integer',
  88. '24Int' => '24-bit integer',
  89. '32Int' => '32-bit integer',
  90. '32Float' => '32-bit float',
  91. 'Compressed' => 'Compressed',
  92. 'Packed' => 'Packed',
  93. 'Other' => 'Other',
  94. },
  95. },
  96. audioChannelType => {
  97. PrintConv => {
  98. 'Mono' => 'Mono',
  99. 'Stereo' => 'Stereo',
  100. '5.1' => '5.1',
  101. '7.1' => '7.1',
  102. '16 Channel' => '16 Channel',
  103. 'Other' => 'Other',
  104. },
  105. },
  106. audioCompressor => { },
  107. beatSpliceParams => {
  108. Struct => {
  109. STRUCT_NAME => 'BeatSpliceStretch',
  110. NAMESPACE => 'xmpDM',
  111. riseInDecibel => { Writable => 'real' },
  112. riseInTimeDuration => { Struct => \%sTime },
  113. useFileBeatsMarker => { Writable => 'boolean' },
  114. },
  115. },
  116. cameraAngle => { },
  117. cameraLabel => { },
  118. cameraModel => { },
  119. cameraMove => { },
  120. client => { },
  121. comment => { Name => 'DMComment' },
  122. composer => { Groups => { 2 => 'Author' } },
  123. contributedMedia => {
  124. Struct => {
  125. STRUCT_NAME => 'Media',
  126. NAMESPACE => 'xmpDM',
  127. duration => { Struct => \%sTime },
  128. managed => { Writable => 'boolean' },
  129. path => { },
  130. startTime => { Struct => \%sTime },
  131. track => { },
  132. webStatement=> { },
  133. },
  134. List => 'Bag',
  135. },
  136. copyright => { Avoid => 1, Groups => { 2 => 'Author' } }, # (deprecated)
  137. director => { },
  138. directorPhotography => { },
  139. discNumber => { }, #12
  140. duration => { Struct => \%sTime },
  141. engineer => { },
  142. fileDataRate => { Writable => 'rational' },
  143. genre => { },
  144. good => { Writable => 'boolean' },
  145. instrument => { },
  146. introTime => { Struct => \%sTime },
  147. key => {
  148. PrintConvColumns => 3,
  149. PrintConv => {
  150. 'C' => 'C', 'C#' => 'C#', 'D' => 'D', 'D#' => 'D#',
  151. 'E' => 'E', 'F' => 'F', 'F#' => 'F#', 'G' => 'G',
  152. 'G#' => 'G#', 'A' => 'A', 'A#' => 'A#', 'B' => 'B',
  153. },
  154. },
  155. logComment => { },
  156. loop => { Writable => 'boolean' },
  157. lyrics => { }, #12
  158. numberOfBeats => { Writable => 'real' },
  159. markers => { Struct => \%sMarker, List => 'Seq' },
  160. metadataModDate => { Groups => { 2 => 'Time' }, %dateTimeInfo },
  161. outCue => { Struct => \%sTime },
  162. partOfCompilation=>{ Writable => 'boolean' }, #12
  163. projectName => { },
  164. projectRef => {
  165. Struct => {
  166. STRUCT_NAME => 'ProjectLink',
  167. NAMESPACE => 'xmpDM',
  168. path => { },
  169. type => {
  170. PrintConv => {
  171. movie => 'Movie',
  172. still => 'Still Image',
  173. audio => 'Audio',
  174. custom => 'Custom',
  175. },
  176. },
  177. },
  178. },
  179. pullDown => {
  180. PrintConvColumns => 2,
  181. PrintConv => {
  182. 'WSSWW' => 'WSSWW', 'SSWWW' => 'SSWWW',
  183. 'SWWWS' => 'SWWWS', 'WWWSS' => 'WWWSS',
  184. 'WWSSW' => 'WWSSW', 'WWWSW' => 'WWWSW',
  185. 'WWSWW' => 'WWSWW', 'WSWWW' => 'WSWWW',
  186. 'SWWWW' => 'SWWWW', 'WWWWS' => 'WWWWS',
  187. },
  188. },
  189. relativePeakAudioFilePath => { },
  190. relativeTimestamp => { Struct => \%sTime },
  191. releaseDate => { Groups => { 2 => 'Time' }, %dateTimeInfo },
  192. resampleParams => {
  193. Struct => {
  194. STRUCT_NAME => 'ResampleStretch',
  195. NAMESPACE => 'xmpDM',
  196. quality => { PrintConv => { Low => 'Low', Medium => 'Medium', High => 'High' } },
  197. },
  198. },
  199. scaleType => {
  200. PrintConv => {
  201. Major => 'Major',
  202. Minor => 'Minor',
  203. Both => 'Both',
  204. Neither => 'Neither',
  205. },
  206. },
  207. scene => { Avoid => 1 },
  208. shotDate => { Groups => { 2 => 'Time' }, %dateTimeInfo },
  209. shotDay => { },
  210. shotLocation => { },
  211. shotName => { },
  212. shotNumber => { },
  213. shotSize => { },
  214. speakerPlacement=> { },
  215. startTimecode => { Struct => \%sTimecode },
  216. startTimeSampleSize => { Writable => 'integer' }, #PH
  217. startTimeScale => { }, #PH (real?)
  218. stretchMode => {
  219. PrintConv => {
  220. 'Fixed length' => 'Fixed length',
  221. 'Time-Scale' => 'Time-Scale',
  222. 'Resample' => 'Resample',
  223. 'Beat Splice' => 'Beat Splice',
  224. 'Hybrid' => 'Hybrid',
  225. },
  226. },
  227. takeNumber => { Writable => 'integer' },
  228. tapeName => { },
  229. tempo => { Writable => 'real' },
  230. timeScaleParams => {
  231. Struct => {
  232. STRUCT_NAME => 'TimeScaleStretch',
  233. NAMESPACE => 'xmpDM',
  234. frameOverlappingPercentage => { Writable => 'real' },
  235. frameSize => { Writable => 'real' },
  236. quality => { PrintConv => { Low => 'Low', Medium => 'Medium', High => 'High' } },
  237. },
  238. },
  239. timeSignature => {
  240. PrintConvColumns => 3,
  241. PrintConv => {
  242. '2/4' => '2/4', '3/4' => '3/4', '4/4' => '4/4',
  243. '5/4' => '5/4', '7/4' => '7/4', '6/8' => '6/8',
  244. '9/8' => '9/8', '12/8'=> '12/8', 'other' => 'other',
  245. },
  246. },
  247. trackNumber => { Writable => 'integer' },
  248. Tracks => {
  249. Struct => {
  250. STRUCT_NAME => 'Track',
  251. NAMESPACE => 'xmpDM',
  252. frameRate => { },
  253. markers => { Struct => \%sMarker, List => 'Seq' },
  254. trackName => { },
  255. trackType => { },
  256. },
  257. List => 'Bag',
  258. },
  259. videoAlphaMode => {
  260. PrintConv => {
  261. 'straight' => 'Straight',
  262. 'pre-multiplied', => 'Pre-multiplied',
  263. 'none' => 'None',
  264. },
  265. },
  266. videoAlphaPremultipleColor => { Struct => \%sColorant },
  267. videoAlphaUnityIsTransparent => { Writable => 'boolean' },
  268. videoColorSpace => {
  269. PrintConv => {
  270. 'sRGB' => 'sRGB',
  271. 'CCIR-601' => 'CCIR-601',
  272. 'CCIR-709' => 'CCIR-709',
  273. },
  274. },
  275. videoCompressor => { },
  276. videoFieldOrder => {
  277. PrintConv => {
  278. Upper => 'Upper',
  279. Lower => 'Lower',
  280. Progressive => 'Progressive',
  281. },
  282. },
  283. videoFrameRate => { Writable => 'real' },
  284. videoFrameSize => { Struct => \%sDimensions },
  285. videoModDate => { Groups => { 2 => 'Time' }, %dateTimeInfo },
  286. videoPixelAspectRatio => { Writable => 'rational' },
  287. videoPixelDepth => {
  288. PrintConv => {
  289. '8Int' => '8-bit integer',
  290. '16Int' => '16-bit integer',
  291. '24Int' => '24-bit integer',
  292. '32Int' => '32-bit integer',
  293. '32Float' => '32-bit float',
  294. 'Other' => 'Other',
  295. },
  296. },
  297. );
  298. #------------------------------------------------------------------------------
  299. # PLUS (Picture Licensing Universal System)
  300. # PLUS vocabulary conversions
  301. my %plusVocab = (
  302. ValueConv => '$val =~ s{http://ns.useplus.org/ldf/vocab/}{}; $val',
  303. ValueConvInv => '"http://ns.useplus.org/ldf/vocab/$val"',
  304. );
  305. # PLUS License Data Format 1.2.1 structures
  306. # (this seems crazy to me -- why did they define different ID/Name structures
  307. # for each field rather than just re-using the same structure?)
  308. my %plusLicensee = (
  309. STRUCT_NAME => 'Licensee',
  310. NAMESPACE => 'plus',
  311. # all "rdf:type" properties removed in version 1.2.1
  312. # (idiots. Why did they put them there in the first place? -- it required
  313. # a special patch for ExifTool to support these, and now they are gone!)
  314. # TYPE => 'plus:LicenseeDetail', (removed in 1.2.1)
  315. LicenseeID => { },
  316. LicenseeName=> { },
  317. );
  318. my %plusEndUser = (
  319. STRUCT_NAME => 'EndUser',
  320. NAMESPACE => 'plus',
  321. # TYPE => 'plus:EndUserDetail', (removed in 1.2.1)
  322. EndUserID => { },
  323. EndUserName => { },
  324. );
  325. my %plusLicensor = (
  326. STRUCT_NAME => 'Licensor',
  327. NAMESPACE => 'plus',
  328. # TYPE => 'plus:LicensorDetail', (removed in 1.2.1)
  329. LicensorID => { },
  330. LicensorName => { },
  331. LicensorStreetAddress => { },
  332. LicensorExtendedAddress => { },
  333. LicensorCity => { },
  334. LicensorRegion => { },
  335. LicensorPostalCode => { },
  336. LicensorCountry => { },
  337. LicensorTelephoneType1 => {
  338. %plusVocab,
  339. PrintConv => {
  340. 'work' => 'Work',
  341. 'cell' => 'Cell',
  342. 'fax' => 'FAX',
  343. 'home' => 'Home',
  344. 'pager' => 'Pager',
  345. },
  346. },
  347. LicensorTelephone1 => { },
  348. LicensorTelephoneType2 => {
  349. %plusVocab,
  350. PrintConv => {
  351. 'work' => 'Work',
  352. 'cell' => 'Cell',
  353. 'fax' => 'FAX',
  354. 'home' => 'Home',
  355. 'pager' => 'Pager',
  356. },
  357. },
  358. LicensorTelephone2 => { },
  359. LicensorEmail => { },
  360. LicensorURL => { },
  361. );
  362. my %plusCopyrightOwner = (
  363. STRUCT_NAME => 'CopyrightOwner',
  364. NAMESPACE => 'plus',
  365. # TYPE => 'plus:CopyrightOwnerDetail', (removed in 1.2.1)
  366. CopyrightOwnerID => { },
  367. CopyrightOwnerName => { },
  368. );
  369. my %plusImageCreator = (
  370. STRUCT_NAME => 'ImageCreator',
  371. NAMESPACE => 'plus',
  372. # TYPE => 'plus:ImageCreatorDetail', (removed in 1.2.1)
  373. ImageCreatorID => { },
  374. ImageCreatorName => { },
  375. );
  376. my %plusImageSupplier = (
  377. STRUCT_NAME => 'ImageSupplier',
  378. NAMESPACE => 'plus',
  379. # TYPE => 'plus:ImageSupplierDetail', (removed in 1.2.1)
  380. ImageSupplierID => { },
  381. ImageSupplierName => { },
  382. );
  383. # PLUS License Data Format 1.2.0 (plus) (ref 1)
  384. %Image::ExifTool::XMP::plus = (
  385. %xmpTableDefaults,
  386. GROUPS => { 0 => 'XMP', 1 => 'XMP-plus', 2 => 'Author' },
  387. NAMESPACE => 'plus',
  388. NOTES => q{
  389. PLUS License Data Format 1.2.1 namespace tags. Note that all
  390. controlled-vocabulary tags in this table (ie. tags with a fixed set of
  391. values) have raw values which begin with "http://ns.useplus.org/ldf/vocab/",
  392. but to reduce clutter this prefix has been removed from the values shown
  393. below. (see L<http://ns.useplus.org/>)
  394. },
  395. Version => { Name => 'PLUSVersion' },
  396. Licensee => {
  397. FlatName => '',
  398. Struct => \%plusLicensee,
  399. List => 'Seq',
  400. },
  401. EndUser => {
  402. FlatName => '',
  403. Struct => \%plusEndUser,
  404. List => 'Seq',
  405. },
  406. Licensor => {
  407. FlatName => '',
  408. Struct => \%plusLicensor,
  409. List => 'Seq',
  410. },
  411. LicensorNotes => { Writable => 'lang-alt' },
  412. MediaSummaryCode => { },
  413. LicenseStartDate => { %dateTimeInfo, Groups => { 2 => 'Time'} },
  414. LicenseEndDate => { %dateTimeInfo, Groups => { 2 => 'Time'} },
  415. MediaConstraints => { Writable => 'lang-alt' },
  416. RegionConstraints => { Writable => 'lang-alt' },
  417. ProductOrServiceConstraints => { Writable => 'lang-alt' },
  418. ImageFileConstraints => {
  419. List => 'Bag',
  420. %plusVocab,
  421. PrintConv => {
  422. 'IF-MFN' => 'Maintain File Name',
  423. 'IF-MID' => 'Maintain ID in File Name',
  424. 'IF-MMD' => 'Maintain Metadata',
  425. 'IF-MFT' => 'Maintain File Type',
  426. },
  427. },
  428. ImageAlterationConstraints => {
  429. List => 'Bag',
  430. %plusVocab,
  431. PrintConv => {
  432. 'AL-CRP' => 'No Cropping',
  433. 'AL-FLP' => 'No Flipping',
  434. 'AL-RET' => 'No Retouching',
  435. 'AL-CLR' => 'No Colorization',
  436. 'AL-DCL' => 'No De-Colorization',
  437. 'AL-MRG' => 'No Merging',
  438. },
  439. },
  440. ImageDuplicationConstraints => {
  441. %plusVocab,
  442. PrintConv => {
  443. 'DP-NDC' => 'No Duplication Constraints',
  444. 'DP-LIC' => 'Duplication Only as Necessary Under License',
  445. 'DP-NOD' => 'No Duplication',
  446. },
  447. },
  448. ModelReleaseStatus => {
  449. %plusVocab,
  450. PrintConv => {
  451. 'MR-NON' => 'None',
  452. 'MR-NAP' => 'Not Applicable',
  453. 'MR-UMR' => 'Unlimited Model Releases',
  454. 'MR-LMR' => 'Limited or Incomplete Model Releases',
  455. },
  456. },
  457. ModelReleaseID => { List => 'Bag' },
  458. MinorModelAgeDisclosure => {
  459. %plusVocab,
  460. PrintConv => {
  461. 'AG-UNK' => 'Age Unknown',
  462. 'AG-A25' => 'Age 25 or Over',
  463. 'AG-A24' => 'Age 24',
  464. 'AG-A23' => 'Age 23',
  465. 'AG-A22' => 'Age 22',
  466. 'AG-A21' => 'Age 21',
  467. 'AG-A20' => 'Age 20',
  468. 'AG-A19' => 'Age 19',
  469. 'AG-A18' => 'Age 18',
  470. 'AG-A17' => 'Age 17',
  471. 'AG-A16' => 'Age 16',
  472. 'AG-A15' => 'Age 15',
  473. 'AG-U14' => 'Age 14 or Under',
  474. },
  475. },
  476. PropertyReleaseStatus => {
  477. %plusVocab,
  478. PrintConv => {
  479. 'PR-NON' => 'None',
  480. 'PR-NAP' => 'Not Applicable',
  481. 'PR-UPR' => 'Unlimited Property Releases',
  482. 'PR-LPR' => 'Limited or Incomplete Property Releases',
  483. },
  484. },
  485. PropertyReleaseID => { List => 'Bag' },
  486. OtherConstraints => { Writable => 'lang-alt' },
  487. CreditLineRequired => {
  488. %plusVocab,
  489. PrintConv => {
  490. 'CR-NRQ' => 'Not Required',
  491. 'CR-COI' => 'Credit on Image',
  492. 'CR-CAI' => 'Credit Adjacent To Image',
  493. 'CR-CCA' => 'Credit in Credits Area',
  494. },
  495. },
  496. AdultContentWarning => {
  497. %plusVocab,
  498. PrintConv => {
  499. 'CW-NRQ' => 'Not Required',
  500. 'CW-AWR' => 'Adult Content Warning Required',
  501. 'CW-UNK' => 'Unknown',
  502. },
  503. },
  504. OtherLicenseRequirements => { Writable => 'lang-alt' },
  505. TermsAndConditionsText => { Writable => 'lang-alt' },
  506. TermsAndConditionsURL => { },
  507. OtherConditions => { Writable => 'lang-alt' },
  508. ImageType => {
  509. %plusVocab,
  510. PrintConv => {
  511. 'TY-PHO' => 'Photographic Image',
  512. 'TY-ILL' => 'Illustrated Image',
  513. 'TY-MCI' => 'Multimedia or Composited Image',
  514. 'TY-VID' => 'Video',
  515. 'TY-OTR' => 'Other',
  516. },
  517. },
  518. LicensorImageID => { },
  519. FileNameAsDelivered => { },
  520. ImageFileFormatAsDelivered => {
  521. %plusVocab,
  522. PrintConv => {
  523. 'FF-JPG' => 'JPEG Interchange Formats (JPG, JIF, JFIF)',
  524. 'FF-TIF' => 'Tagged Image File Format (TIFF)',
  525. 'FF-GIF' => 'Graphics Interchange Format (GIF)',
  526. 'FF-RAW' => 'Proprietary RAW Image Format',
  527. 'FF-DNG' => 'Digital Negative (DNG)',
  528. 'FF-EPS' => 'Encapsulated PostScript (EPS)',
  529. 'FF-BMP' => 'Windows Bitmap (BMP)',
  530. 'FF-PSD' => 'Photoshop Document (PSD)',
  531. 'FF-PIC' => 'Macintosh Picture (PICT)',
  532. 'FF-PNG' => 'Portable Network Graphics (PNG)',
  533. 'FF-WMP' => 'Windows Media Photo (HD Photo)',
  534. 'FF-OTR' => 'Other',
  535. },
  536. },
  537. ImageFileSizeAsDelivered => {
  538. %plusVocab,
  539. PrintConv => {
  540. 'SZ-U01' => 'Up to 1 MB',
  541. 'SZ-U10' => 'Up to 10 MB',
  542. 'SZ-U30' => 'Up to 30 MB',
  543. 'SZ-U50' => 'Up to 50 MB',
  544. 'SZ-G50' => 'Greater than 50 MB',
  545. },
  546. },
  547. CopyrightStatus => {
  548. %plusVocab,
  549. PrintConv => {
  550. 'CS-PRO' => 'Protected',
  551. 'CS-PUB' => 'Public Domain',
  552. 'CS-UNK' => 'Unknown',
  553. },
  554. },
  555. CopyrightRegistrationNumber => { },
  556. FirstPublicationDate => { %dateTimeInfo, Groups => { 2 => 'Time'} },
  557. CopyrightOwner => {
  558. FlatName => '',
  559. Struct => \%plusCopyrightOwner,
  560. List => 'Seq',
  561. },
  562. CopyrightOwnerImageID => { },
  563. ImageCreator => {
  564. FlatName => '',
  565. Struct => \%plusImageCreator,
  566. List => 'Seq',
  567. },
  568. ImageCreatorImageID => { },
  569. ImageSupplier => {
  570. FlatName => '',
  571. Struct => \%plusImageSupplier,
  572. List => 'Seq',
  573. },
  574. ImageSupplierImageID => { },
  575. LicenseeImageID => { },
  576. LicenseeImageNotes => { Writable => 'lang-alt' },
  577. OtherImageInfo => { Writable => 'lang-alt' },
  578. LicenseID => { },
  579. LicensorTransactionID => { List => 'Bag' },
  580. LicenseeTransactionID => { List => 'Bag' },
  581. LicenseeProjectReference=> { List => 'Bag' },
  582. LicenseTransactionDate => { %dateTimeInfo, Groups => { 2 => 'Time'} },
  583. Reuse => {
  584. %plusVocab,
  585. PrintConv => {
  586. 'RE-REU' => 'Repeat Use',
  587. 'RE-NAP' => 'Not Applicable',
  588. },
  589. },
  590. OtherLicenseDocuments => { List => 'Bag' },
  591. OtherLicenseInfo => { Writable => 'lang-alt' },
  592. # Note: these are Bag's of lang-alt lists -- a nested list tag!
  593. Custom1 => { List => 'Bag', Writable => 'lang-alt' },
  594. Custom2 => { List => 'Bag', Writable => 'lang-alt' },
  595. Custom3 => { List => 'Bag', Writable => 'lang-alt' },
  596. Custom4 => { List => 'Bag', Writable => 'lang-alt' },
  597. Custom5 => { List => 'Bag', Writable => 'lang-alt' },
  598. Custom6 => { List => 'Bag', Writable => 'lang-alt' },
  599. Custom7 => { List => 'Bag', Writable => 'lang-alt' },
  600. Custom8 => { List => 'Bag', Writable => 'lang-alt' },
  601. Custom9 => { List => 'Bag', Writable => 'lang-alt' },
  602. Custom10 => { List => 'Bag', Writable => 'lang-alt' },
  603. );
  604. #------------------------------------------------------------------------------
  605. # PRISM
  606. #
  607. # NOTE: The "Avoid" flag is set for all PRISM tags
  608. # my %obsolete = (
  609. # Notes => 'obsolete in 2.0',
  610. # ValueConvInv => sub {
  611. # my ($val, $self) = @_;
  612. # unless ($self->Options('IgnoreMinorErrors')) {
  613. # warn "Warning: [minor] Attempt to write obsolete tag\n";
  614. # return undef;
  615. # }
  616. # return $val;
  617. # }
  618. # );
  619. # PRISM structure definitions
  620. my %prismPublicationDate = (
  621. STRUCT_NAME => 'prismPublicationDate',
  622. NAMESPACE => 'prism',
  623. date => { %dateTimeInfo, Groups => { 2 => 'Time'} },
  624. 'a-platform'=> { },
  625. );
  626. # Publishing Requirements for Industry Standard Metadata (prism) (ref 2)
  627. %Image::ExifTool::XMP::prism = (
  628. %xmpTableDefaults,
  629. GROUPS => { 0 => 'XMP', 1 => 'XMP-prism', 2 => 'Document' },
  630. NAMESPACE => 'prism',
  631. NOTES => q{
  632. Publishing Requirements for Industry Standard Metadata 3.0 namespace
  633. tags. (see L<http://www.prismstandard.org/>)
  634. },
  635. acedemicField => { }, # (3.0)
  636. aggregateIssueNumber => { Writable => 'integer' }, # (3.0)
  637. aggregationType => { List => 'Bag' },
  638. alternateTitle => {
  639. List => 'Bag',
  640. Struct => { # (becomes a structure in 3.0)
  641. STRUCT_NAME => 'prismAlternateTitle',
  642. NAMESPACE => 'prism',
  643. text => { },
  644. 'a-platform'=> { },
  645. 'a-lang' => { },
  646. },
  647. },
  648. blogTitle => { }, # (3.0)
  649. blogURL => { }, # (3.0)
  650. bookEdition => { }, # (3.0)
  651. byteCount => { Writable => 'integer' },
  652. channel => {
  653. List => 'Bag',
  654. Struct => { # (becomes a structure in 3.0)
  655. STRUCT_NAME => 'prismChannel',
  656. NAMESPACE => 'prism',
  657. channel => { },
  658. subchannel1 => { },
  659. subchannel2 => { },
  660. subchannel3 => { },
  661. subchannel4 => { },
  662. 'a-lang' => { },
  663. },
  664. },
  665. complianceProfile=>{ PrintConv => { three => 'Three' } },
  666. contentType => { }, # (3.0)
  667. copyrightYear => { }, # (3.0)
  668. # copyright => { Groups => { 2 => 'Author' } }, # (deprecated in 3.0)
  669. corporateEntity => { List => 'Bag' },
  670. coverDate => { %dateTimeInfo, Groups => { 2 => 'Time'} },
  671. coverDisplayDate=> { },
  672. creationDate => { %dateTimeInfo, Groups => { 2 => 'Time'} },
  673. dateRecieved => { %dateTimeInfo, Groups => { 2 => 'Time'} },
  674. device => { }, # (3.0)
  675. distributor => { },
  676. doi => { Name => 'DOI', Description => 'Digital Object Identifier' },
  677. edition => { },
  678. eIssn => { },
  679. #embargoDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} }, # (deprecated in 3.0)
  680. endingPage => { },
  681. event => { List => 'Bag' },
  682. #expirationDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} }, # (deprecated in 3.0)
  683. genre => { List => 'Bag' },
  684. hasAlternative => { List => 'Bag' },
  685. hasCorrection => {
  686. Struct => { # (becomes a structure in 3.0)
  687. STRUCT_NAME => 'prismHasCorrection',
  688. NAMESPACE => 'prism',
  689. text => { },
  690. 'a-platform'=> { },
  691. 'a-lang' => { },
  692. },
  693. },
  694. # hasPreviousVersion => { }, # (not in 3.0)
  695. hasTranslation => { List => 'Bag' },
  696. industry => { List => 'Bag' },
  697. isAlternativeOf => { List => 'Bag' }, # (3.0)
  698. isbn => { Name => 'ISBN', List => 'Bag' }, # 2.1 (becomes a list in 3.0)
  699. isCorrectionOf => { List => 'Bag' },
  700. issn => { Name => 'ISSN' },
  701. issueIdentifier => { },
  702. issueName => { },
  703. issueTeaser => { }, # (3.0)
  704. issueType => { }, # (3.0)
  705. isTranslationOf => { },
  706. keyword => { List => 'Bag' },
  707. killDate => {
  708. Struct => { # (becomes a structure in 3.0)
  709. STRUCT_NAME => 'prismKillDate',
  710. NAMESPACE => 'prism',
  711. date => { %dateTimeInfo, Groups => { 2 => 'Time'} },
  712. 'a-platform'=> { }, #PH (missed in spec?)
  713. },
  714. },
  715. 'link' => { List => 'Bag' }, # (3.0)
  716. location => { List => 'Bag' },
  717. # metadataContainer => { }, (not valid for PRISM XMP)
  718. modificationDate=> { %dateTimeInfo, Groups => { 2 => 'Time'} },
  719. nationalCatalogNumber => { }, # (3.0)
  720. number => { },
  721. object => { List => 'Bag' },
  722. onSaleDate => { # (3.0)
  723. List => 'Bag',
  724. Struct => {
  725. STRUCT_NAME => 'prismOnSaleDate',
  726. NAMESPACE => 'prism',
  727. date => { %dateTimeInfo, Groups => { 2 => 'Time'} },
  728. 'a-platform'=> { },
  729. },
  730. },
  731. onSaleDay => { # (3.0)
  732. List => 'Bag',
  733. Struct => {
  734. STRUCT_NAME => 'prismOnSaleDay',
  735. NAMESPACE => 'prism',
  736. day => { }, #PH (not named in spec)
  737. 'a-platform'=> { },
  738. },
  739. },
  740. offSaleDate => { # (3.0)
  741. List => 'Bag',
  742. Struct => {
  743. STRUCT_NAME => 'prismOffSaleDate',
  744. NAMESPACE => 'prism',
  745. date => { %dateTimeInfo, Groups => { 2 => 'Time'} },
  746. 'a-platform'=> { },
  747. },
  748. },
  749. organization => { List => 'Bag' },
  750. originPlatform => {
  751. List => 'Bag',
  752. PrintConv => {
  753. email => 'E-Mail',
  754. mobile => 'Mobile',
  755. broadcast => 'Broadcast',
  756. web => 'Web',
  757. 'print' => 'Print',
  758. recordableMedia => 'Recordable Media',
  759. other => 'Other',
  760. },
  761. },
  762. pageCount => { Writable => 'integer' }, # (3.0)
  763. pageProgressionDirection => { # (3.0)
  764. PrintConv => { LTR => 'Left to Right', RTL => 'Right to Left' },
  765. },
  766. pageRange => { List => 'Bag' },
  767. person => { },
  768. platform => { }, # (3.0)
  769. productCode => { }, # (3.0)
  770. profession => { }, # (3.0)
  771. publicationDate => {
  772. List => 'Bag',
  773. Struct => \%prismPublicationDate, # (becomes a structure in 3.0)
  774. },
  775. publicationDisplayDate => { # (3.0)
  776. List => 'Bag',
  777. Struct => \%prismPublicationDate,
  778. },
  779. publicationName => { },
  780. publishingFrequency => { }, # (3.0)
  781. rating => { },
  782. # rightsAgent => { }, # (deprecated in 3.0)
  783. samplePageRange => { }, # (3.0)
  784. section => { },
  785. sellingAgency => { }, # (3.0)
  786. seriesNumber => { Writable => 'integer' }, # (3.0)
  787. seriesTitle => { }, # (3.0)
  788. sport => { }, # (3.0)
  789. startingPage => { },
  790. subsection1 => { },
  791. subsection2 => { },
  792. subsection3 => { },
  793. subsection4 => { },
  794. subtitle => { }, # (3.0)
  795. supplementDisplayID => { }, # (3.0)
  796. supplementStartingPage => { }, # (3.0)
  797. supplementTitle => { }, # (3.0)
  798. teaser => { List => 'Bag' },
  799. ticker => { List => 'Bag' },
  800. timePeriod => { },
  801. url => {
  802. Name => 'URL',
  803. List => 'Bag',
  804. Struct => { # (becomes a structure in 3.0)
  805. STRUCT_NAME => 'prismUrl',
  806. NAMESPACE => 'prism',
  807. url => { },
  808. 'a-platform'=> { },
  809. },
  810. },
  811. uspsNumber => { }, # (3.0)
  812. versionIdentifier => { },
  813. volume => { },
  814. wordCount => { Writable => 'integer' },
  815. # tags that existed in version 1.3
  816. # category => { %obsolete, List => 'Bag' },
  817. # hasFormat => { %obsolete, List => 'Bag' },
  818. # hasPart => { %obsolete, List => 'Bag' },
  819. # isFormatOf => { %obsolete, List => 'Bag' },
  820. # isPartOf => { %obsolete },
  821. # isReferencedBy => { %obsolete, List => 'Bag' },
  822. # isRequiredBy => { %obsolete, List => 'Bag' },
  823. # isVersionOf => { %obsolete },
  824. # objectTitle => { %obsolete, List => 'Bag' },
  825. # receptionDate => { %obsolete },
  826. # references => { %obsolete, List => 'Bag' },
  827. # requires => { %obsolete, List => 'Bag' },
  828. # tags in older versions
  829. # page
  830. # contentLength
  831. # creationTime
  832. # expirationTime
  833. # hasVersion
  834. # isAlternativeFor
  835. # isBasedOn
  836. # isBasisFor
  837. # modificationTime
  838. # publicationTime
  839. # receptionTime
  840. # releaseTime
  841. );
  842. # PRISM Rights Language namespace (prl) (ref 2)
  843. %Image::ExifTool::XMP::prl = (
  844. %xmpTableDefaults,
  845. GROUPS => { 0 => 'XMP', 1 => 'XMP-prl', 2 => 'Document' },
  846. NAMESPACE => 'prl',
  847. NOTES => q{
  848. PRISM Rights Language 2.1 namespace tags. These tags have been deprecated
  849. since the release of the PRISM Usage Rights 3.0. (see
  850. L<http://www.prismstandard.org/>)
  851. },
  852. geography => { List => 'Bag' },
  853. industry => { List => 'Bag' },
  854. usage => { List => 'Bag' },
  855. );
  856. # PRISM Usage Rights namespace (prismusagerights) (ref 2)
  857. %Image::ExifTool::XMP::pur = (
  858. %xmpTableDefaults,
  859. GROUPS => { 0 => 'XMP', 1 => 'XMP-pur', 2 => 'Document' },
  860. NAMESPACE => 'pur',
  861. NOTES => q{
  862. PRISM Usage Rights 3.0 namespace tags. (see
  863. L<http://www.prismstandard.org/>)
  864. },
  865. adultContentWarning => { List => 'Bag' },
  866. agreement => { List => 'Bag' },
  867. copyright => {
  868. # (not clear in 3.0 spec, which lists only "bag Text", and called
  869. # "copyrightDate" instead of "copyright" the PRISM basic 3.0 spec)
  870. Writable => 'lang-alt',
  871. Groups => { 2 => 'Author' },
  872. },
  873. creditLine => { List => 'Bag' },
  874. embargoDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
  875. exclusivityEndDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
  876. expirationDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
  877. imageSizeRestriction=> { },
  878. optionEndDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
  879. permissions => { List => 'Bag' },
  880. restrictions => { List => 'Bag' },
  881. reuseProhibited => { Writable => 'boolean' },
  882. rightsAgent => { },
  883. rightsOwner => { },
  884. # usageFee => { List => 'Bag' }, # (not in 3.0)
  885. );
  886. # PRISM Metadata for Images namespace (pmi) (ref 2)
  887. %Image::ExifTool::XMP::pmi = (
  888. %xmpTableDefaults,
  889. GROUPS => { 0 => 'XMP', 1 => 'XMP-pmi', 2 => 'Image' },
  890. NAMESPACE => 'pmi',
  891. NOTES => q{
  892. PRISM Metadata for Images 3.0 namespace tags. (see
  893. L<http://www.prismstandard.org/>)
  894. },
  895. color => {
  896. PrintConv => {
  897. bw => 'BW',
  898. color => 'Color',
  899. sepia => 'Sepia',
  900. duotone => 'Duotone',
  901. tritone => 'Tritone',
  902. quadtone => 'Quadtone',
  903. },
  904. },
  905. contactInfo => { },
  906. displayName => { },
  907. distributorProductID => { },
  908. eventAlias => { },
  909. eventEnd => { },
  910. eventStart => { },
  911. eventSubtype => { },
  912. eventType => { },
  913. field => { },
  914. framing => { },
  915. location => { },
  916. make => { },
  917. manufacturer => { },
  918. model => { },
  919. modelYear => { },
  920. objectDescription=>{ },
  921. objectSubtype => { },
  922. objectType => { },
  923. orientation => {
  924. PrintConv => {
  925. horizontal => 'Horizontal',
  926. vertical => 'Vertical',
  927. }
  928. },
  929. positionDescriptor => { },
  930. productID => { },
  931. productIDType => { },
  932. season => {
  933. PrintConv => {
  934. spring => 'Spring',
  935. summer => 'Summer',
  936. fall => 'Fall',
  937. winter => 'Winter',
  938. },
  939. },
  940. sequenceName => { },
  941. sequenceNumber => { },
  942. sequenceTotalNumber => { },
  943. setting => { },
  944. shootID => { },
  945. slideshowName => { },
  946. slideshowNumber => { Writable => 'integer' },
  947. slideshowTotalNumber => { Writable => 'integer' },
  948. viewpoint => { },
  949. visualTechnique => { },
  950. );
  951. # PRISM Recipe Metadata (prm) (ref 2)
  952. %Image::ExifTool::XMP::prm = (
  953. %xmpTableDefaults,
  954. GROUPS => { 0 => 'XMP', 1 => 'XMP-prm', 2 => 'Document' },
  955. NAMESPACE => 'prm',
  956. NOTES => q{
  957. PRISM Recipe Metadata 3.0 namespace tags. (see
  958. L<http://www.prismstandard.org/>)
  959. },
  960. cookingEquipment => { },
  961. cookingMethod => { },
  962. course => { },
  963. cuisine => { },
  964. dietaryNeeds => { },
  965. dishType => { },
  966. duration => { },
  967. ingredientExclusion => { },
  968. mainIngredient => { },
  969. meal => { },
  970. recipeEndingPage => { },
  971. recipePageRange => { },
  972. recipeSource => { },
  973. recipeStartingPage => { },
  974. recipeTitle => { },
  975. servingSize => { },
  976. skillLevel => { },
  977. specialOccasion => { },
  978. yield => { },
  979. );
  980. #------------------------------------------------------------------------------
  981. # DICOM namespace properties (DICOM) (ref PH, written by CS3)
  982. %Image::ExifTool::XMP::DICOM = (
  983. %xmpTableDefaults,
  984. GROUPS => { 1 => 'XMP-DICOM', 2 => 'Image' },
  985. NAMESPACE => 'DICOM',
  986. NOTES => q{
  987. DICOM namespace tags. These XMP tags allow some DICOM information to be
  988. stored in files of other than DICOM format. See the
  989. L<DICOM Tags documentation|Image::ExifTool::TagNames/DICOM Tags> for a list
  990. of tags available in DICOM-format files.
  991. },
  992. # change some tag names to correspond with DICOM tags
  993. PatientName => { },
  994. PatientID => { },
  995. PatientSex => { },
  996. PatientDOB => {
  997. Name => 'PatientBirthDate',
  998. Groups => { 2 => 'Time' },
  999. %dateTimeInfo,
  1000. },
  1001. StudyID => { },
  1002. StudyPhysician => { },
  1003. StudyDateTime => { Groups => { 2 => 'Time' }, %dateTimeInfo },
  1004. StudyDescription => { },
  1005. SeriesNumber => { },
  1006. SeriesModality => { },
  1007. SeriesDateTime => { Groups => { 2 => 'Time' }, %dateTimeInfo },
  1008. SeriesDescription => { },
  1009. EquipmentInstitution => { },
  1010. EquipmentManufacturer => { },
  1011. );
  1012. # PixelLive namespace properties (PixelLive) (ref 3)
  1013. %Image::ExifTool::XMP::PixelLive = (
  1014. GROUPS => { 1 => 'XMP-PixelLive', 2 => 'Image' },
  1015. NAMESPACE => 'PixelLive',
  1016. NOTES => q{
  1017. PixelLive namespace tags. These tags are not writable becase they are very
  1018. uncommon and I haven't been able to locate a reference which gives the
  1019. namespace URI.
  1020. },
  1021. AUTHOR => { Name => 'Author', Avoid => 1, Groups => { 2 => 'Author' } },
  1022. COMMENTS => { Name => 'Comments', Avoid => 1 },
  1023. COPYRIGHT => { Name => 'Copyright',Avoid => 1, Groups => { 2 => 'Author' } },
  1024. DATE => { Name => 'Date', Avoid => 1, Groups => { 2 => 'Time' } },
  1025. GENRE => { Name => 'Genre', Avoid => 1 },
  1026. TITLE => { Name => 'Title', Avoid => 1 },
  1027. );
  1028. # Extensis Portfolio tags (extensis) (ref 11)
  1029. %Image::ExifTool::XMP::extensis = (
  1030. %xmpTableDefaults,
  1031. GROUPS => { 1 => 'XMP-extensis', 2 => 'Image' },
  1032. NAMESPACE => 'extensis',
  1033. NOTES => 'Tags used by Extensis Portfolio.',
  1034. Approved => { Writable => 'boolean' },
  1035. ApprovedBy => { },
  1036. ClientName => { },
  1037. JobName => { },
  1038. JobStatus => { },
  1039. RoutedTo => { },
  1040. RoutingNotes => { },
  1041. WorkToDo => { },
  1042. );
  1043. # IDimager structures (ref PH)
  1044. my %sTagStruct;
  1045. %sTagStruct = (
  1046. STRUCT_NAME => 'TagStructure',
  1047. NAMESPACE => 'ics',
  1048. LabelName => { },
  1049. Reference => { },
  1050. ParentReference => { },
  1051. SubLabels => { Struct => \%sTagStruct, List => 'Bag' },
  1052. );
  1053. my %sSubVersion = (
  1054. STRUCT_NAME => 'SubVersion',
  1055. NAMESPACE => 'ics',
  1056. VersRef => { },
  1057. FileName => { },
  1058. );
  1059. # IDimager namespace (ics) (ref PH)
  1060. %Image::ExifTool::XMP::ics = (
  1061. %xmpTableDefaults,
  1062. GROUPS => { 0 => 'XMP', 1 => 'XMP-ics', 2 => 'Image' },
  1063. NAMESPACE => 'ics',
  1064. NOTES => q{
  1065. Tags used by IDimager. Nested TagStructure structures are unrolled to an
  1066. arbitrary depth of 6 to avoid infinite recursion.
  1067. },
  1068. ImageRef => { },
  1069. TagStructure => { Struct => \%sTagStruct, List => 'Bag' },
  1070. TagStructureLabelName => { Name => 'LabelName1', Flat => 1 },
  1071. TagStructureReference => { Name => 'Reference1', Flat => 1 },
  1072. TagStructureSubLabels => { Name => 'SubLables1', Flat => 1 },
  1073. TagStructureParentReference => { Name => 'ParentReference1', Flat => 1 },
  1074. TagStructureSubLabelsLabelName => { Name => 'LabelName2', Flat => 1 },
  1075. TagStructureSubLabelsReference => { Name => 'Reference2', Flat => 1 },
  1076. TagStructureSubLabelsSubLabels => { Name => 'SubLables2', Flat => 1 },
  1077. TagStructureSubLabelsParentReference => { Name => 'ParentReference2', Flat => 1 },
  1078. TagStructureSubLabelsSubLabelsLabelName => { Name => 'LabelName3', Flat => 1 },
  1079. TagStructureSubLabelsSubLabelsReference => { Name => 'Reference3', Flat => 1 },
  1080. TagStructureSubLabelsSubLabelsSubLabels => { Name => 'SubLables3', Flat => 1 },
  1081. TagStructureSubLabelsSubLabelsParentReference => { Name => 'ParentReference3', Flat => 1 },
  1082. TagStructureSubLabelsSubLabelsSubLabelsLabelName => { Name => 'LabelName4', Flat => 1 },
  1083. TagStructureSubLabelsSubLabelsSubLabelsReference => { Name => 'Reference4', Flat => 1 },
  1084. TagStructureSubLabelsSubLabelsSubLabelsSubLabels => { Name => 'SubLabels4', Flat => 1 },
  1085. TagStructureSubLabelsSubLabelsSubLabelsParentReference => { Name => 'ParentReference4', Flat => 1 },
  1086. TagStructureSubLabelsSubLabelsSubLabelsSubLabelsLabelName => { Name => 'LabelName5', Flat => 1 },
  1087. TagStructureSubLabelsSubLabelsSubLabelsSubLabelsReference => { Name => 'Reference5', Flat => 1 },
  1088. TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabels => { Name => 'SubLabels5', Flat => 1, NoSubStruct => 1 }, # break infinite recursion
  1089. TagStructureSubLabelsSubLabelsSubLabelsSubLabelsParentReference => { Name => 'ParentReference5', Flat => 1 },
  1090. TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsLabelName => { Name => 'LabelName6', Flat => 1 },
  1091. TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsReference => { Name => 'Reference6', Flat => 1 },
  1092. TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsParentReference => { Name => 'ParentReference6', Flat => 1 },
  1093. SubVersions => { Struct => \%sSubVersion, List => 'Bag' },
  1094. SubVersionsVersRef => { Name => 'SubVersionReference', Flat => 1 },
  1095. SubVersionsFileName => { Name => 'SubVersionFileName', Flat => 1 },
  1096. );
  1097. # ACDSee namespace (acdsee) (ref PH)
  1098. %Image::ExifTool::XMP::acdsee = (
  1099. %xmpTableDefaults,
  1100. GROUPS => { 0 => 'XMP', 1 => 'XMP-acdsee', 2 => 'Image' },
  1101. NAMESPACE => 'acdsee',
  1102. NOTES => q{
  1103. ACD Systems ACDSee namespace tags.
  1104. (A note to software developers: Re-inventing your own private tags instead
  1105. of using the equivalent tags in standard XMP namespaces defeats one of the
  1106. most valuable features of metadata: interoperability. Your applications
  1107. mumble to themselves instead of speaking out for the rest of the world to
  1108. hear.)
  1109. },
  1110. author => { Avoid => 1, Groups => { 2 => 'Author' } },
  1111. caption => { Avoid => 1 },
  1112. categories => { Avoid => 1 },
  1113. collections=> { Avoid => 1 },
  1114. datetime => { Name => 'DateTime', Avoid => 1, Groups => { 2 => 'Time' }, %dateTimeInfo },
  1115. keywords => { Avoid => 1, List => 'Bag' },
  1116. notes => { Avoid => 1 },
  1117. rating => { Avoid => 1, Writable => 'real' }, # integer?
  1118. tagged => { Avoid => 1, Writable => 'boolean' },
  1119. rawrppused => { Writable => 'boolean' },
  1120. rpp => {
  1121. Name => 'RPP',
  1122. Writable => 'lang-alt',
  1123. Notes => 'raw processing settings in XML format',
  1124. Binary => 1,
  1125. },
  1126. dpp => {
  1127. Name => 'DPP',
  1128. Writable => 'lang-alt',
  1129. Notes => 'newer version of XML raw processing settings',
  1130. Binary => 1,
  1131. },
  1132. );
  1133. # Picture Licensing Universal System namespace properties (xmpPLUS)
  1134. %Image::ExifTool::XMP::xmpPLUS = (
  1135. %xmpTableDefaults,
  1136. GROUPS => { 1 => 'XMP-xmpPLUS', 2 => 'Author' },
  1137. NAMESPACE => 'xmpPLUS',
  1138. NOTES => 'XMP Picture Licensing Universal System (PLUS) namespace tags.',
  1139. CreditLineReq => { Writable => 'boolean' },
  1140. ReuseAllowed => { Writable => 'boolean' },
  1141. );
  1142. # Creative Commons namespace properties (cc) (ref 5)
  1143. %Image::ExifTool::XMP::cc = (
  1144. %xmpTableDefaults,
  1145. GROUPS => { 1 => 'XMP-cc', 2 => 'Author' },
  1146. NAMESPACE => 'cc',
  1147. NOTES => q{
  1148. Creative Commons namespace tags. Note that the CC specification for XMP is
  1149. non-existent, so ExifTool must make some assumptions about the format of the
  1150. specific properties in XMP (see L<http://creativecommons.org/ns>).
  1151. },
  1152. # Work properties
  1153. license => { Resource => 1 },
  1154. attributionName => { },
  1155. attributionURL => { Resource => 1 },
  1156. morePermissions => { Resource => 1 },
  1157. useGuidelines => { Resource => 1 },
  1158. # License properties
  1159. permits => {
  1160. List => 'Bag',
  1161. Resource => 1,
  1162. PrintConv => {
  1163. 'cc:Sharing' => 'Sharing',
  1164. 'cc:DerivativeWorks' => 'Derivative Works',
  1165. 'cc:Reproduction' => 'Reproduction',
  1166. 'cc:Distribution' => 'Distribution',
  1167. },
  1168. },
  1169. requires => {
  1170. List => 'Bag',
  1171. Resource => 1,
  1172. PrintConv => {
  1173. 'cc:Copyleft' => 'Copyleft',
  1174. 'cc:LesserCopyleft' => 'Lesser Copyleft',
  1175. 'cc:SourceCode' => 'Source Code',
  1176. 'cc:ShareAlike' => 'Share Alike',
  1177. 'cc:Notice' => 'Notice',
  1178. 'cc:Attribution' => 'Attribution',
  1179. },
  1180. },
  1181. prohibits => {
  1182. List => 'Bag',
  1183. Resource => 1,
  1184. PrintConv => {
  1185. 'cc:HighIncomeNationUse' => 'High Income Nation Use',
  1186. 'cc:CommercialUse' => 'Commercial Use',
  1187. },
  1188. },
  1189. jurisdiction => { Resource => 1 },
  1190. legalcode => { Name => 'LegalCode', Resource => 1 },
  1191. deprecatedOn => { %dateTimeInfo, Groups => { 2 => 'Time' } },
  1192. );
  1193. # Description Explorer namespace properties (dex) (ref 6)
  1194. %Image::ExifTool::XMP::dex = (
  1195. %xmpTableDefaults,
  1196. GROUPS => { 1 => 'XMP-dex', 2 => 'Image' },
  1197. NAMESPACE => 'dex',
  1198. NOTES => q{
  1199. Description Explorer namespace tags. These tags are not very common. The
  1200. Source and Rating tags are avoided when writing due to name conflicts with
  1201. other XMP tags. (see L<http://www.optimasc.com/products/fileid/>)
  1202. },
  1203. crc32 => { Name => 'CRC32', Writable => 'integer' },
  1204. source => { Avoid => 1 },
  1205. shortdescription => {
  1206. Name => 'ShortDescription',
  1207. Writable => 'lang-alt',
  1208. },
  1209. licensetype => {
  1210. Name => 'LicenseType',
  1211. PrintConv => {
  1212. unknown => 'Unknown',
  1213. shareware => 'Shareware',
  1214. freeware => 'Freeware',
  1215. adware => 'Adware',
  1216. demo => 'Demo',
  1217. commercial => 'Commercial',
  1218. 'public domain' => 'Public Domain',
  1219. 'open source' => 'Open Source',
  1220. },
  1221. },
  1222. revision => { },
  1223. rating => { Avoid => 1 },
  1224. os => { Name => 'OS', Writable => 'integer' },
  1225. ffid => { Name => 'FFID' },
  1226. );
  1227. # iView MediaPro namespace properties (mediapro) (ref PH)
  1228. %Image::ExifTool::XMP::MediaPro = (
  1229. %xmpTableDefaults,
  1230. GROUPS => { 1 => 'XMP-mediapro', 2 => 'Image' },
  1231. NAMESPACE => 'mediapro',
  1232. NOTES => 'iView MediaPro namespace tags.',
  1233. Event => {
  1234. Avoid => 1,
  1235. Notes => 'avoided due to conflict with XMP-iptcExt:Event',
  1236. },
  1237. Location => {
  1238. Avoid => 1,
  1239. Groups => { 2 => 'Location' },
  1240. Notes => 'avoided due to conflict with XMP-iptcCore:Location',
  1241. },
  1242. Status => { },
  1243. People => { List => 'Bag' },
  1244. UserFields => { List => 'Bag' },
  1245. CatalogSets => { List => 'Bag' },
  1246. );
  1247. # Microsoft ExpressionMedia namespace properties (expressionmedia)
  1248. # (ref http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,4235.0.html)
  1249. %Image::ExifTool::XMP::ExpressionMedia = (
  1250. %xmpTableDefaults,
  1251. GROUPS => { 1 => 'XMP-expressionmedia', 2 => 'Image' },
  1252. NAMESPACE => 'expressionmedia',
  1253. NOTES => q{
  1254. Microsoft Expression Media namespace tags. These tags are avoided when
  1255. writing due to name conflicts with tags in other schemas.
  1256. },
  1257. Event => { Avoid => 1 },
  1258. Status => { Avoid => 1 },
  1259. People => { Avoid => 1, List => 'Bag' },
  1260. CatalogSets => { Avoid => 1, List => 'Bag' },
  1261. );
  1262. # DigiKam namespace tags (ref PH)
  1263. %Image::ExifTool::XMP::digiKam = (
  1264. %xmpTableDefaults,
  1265. GROUPS => { 1 => 'XMP-digiKam', 2 => 'Image' },
  1266. NAMESPACE => 'digiKam',
  1267. NOTES => 'DigiKam namespace tags.',
  1268. CaptionsAuthorNames => { Writable => 'lang-alt' },
  1269. CaptionsDateTimeStamps => { Writable => 'lang-alt', Groups => { 2 => 'Time' } },
  1270. TagsList => { List => 'Seq' },
  1271. ColorLabel => { },
  1272. PickLabel => { },
  1273. ImageHistory => { Avoid => 1, Notes => 'different format from EXIF:ImageHistory' },
  1274. LensCorrectionSettings => { },
  1275. );
  1276. # SWF namespace tags (ref PH)
  1277. %Image::ExifTool::XMP::swf = (
  1278. %xmpTableDefaults,
  1279. GROUPS => { 1 => 'XMP-swf', 2 => 'Image' },
  1280. NAMESPACE => 'swf',
  1281. NOTES => 'Adobe SWF namespace tags.',
  1282. type => { Avoid => 1 },
  1283. bgalpha => { Name => 'BackgroundAlpha', Writable => 'integer' },
  1284. forwardlock => { Name => 'ForwardLock', Writable => 'boolean' },
  1285. maxstorage => { Name => 'MaxStorage', Writable => 'integer' }, # (CS5)
  1286. );
  1287. # Sony Ericsson cell phone location tags
  1288. # refs: http://www.opencellid.org/api
  1289. # http://zonetag.research.yahoo.com/faq_location.php
  1290. # http://www.cs.columbia.edu/sip/drafts/LIF%20TS%20101%20v2.0.0.pdf
  1291. %Image::ExifTool::XMP::cell = (
  1292. %xmpTableDefaults,
  1293. GROUPS => { 1 => 'XMP-cell', 2 => 'Location' },
  1294. NAMESPACE => 'cell',
  1295. NOTES => 'Location tags written by some Sony Ericsson phones.',
  1296. mcc => { Name => 'MobileCountryCode' },
  1297. mnc => { Name => 'MobileNetworkCode' },
  1298. lac => { Name => 'LocationAreaCode' },
  1299. cellid => { Name => 'CellTowerID' },
  1300. cgi => { Name => 'CellGlobalID' },
  1301. r => { Name => 'CellR' }, # (what is this? Radius?)
  1302. );
  1303. # Apple adjustment settings (ref PH)
  1304. %Image::ExifTool::XMP::aas = (
  1305. %xmpTableDefaults,
  1306. GROUPS => { 1 => 'XMP-aas', 2 => 'Image' },
  1307. NAMESPACE => 'aas',
  1308. NOTES => 'Apple Adjustment Settings used by iPhone/iPad.',
  1309. CropX => { Writable => 'integer', Avoid => 1 },
  1310. CropY => { Writable => 'integer', Avoid => 1 },
  1311. CropW => { Writable => 'integer', Avoid => 1 },
  1312. CropH => { Writable => 'integer', Avoid => 1 },
  1313. AffineA => { Writable => 'real' },
  1314. AffineB => { Writable => 'real' },
  1315. AffineC => { Writable => 'real' },
  1316. AffineD => { Writable => 'real' },
  1317. AffineX => { Writable => 'real' },
  1318. AffineY => { Writable => 'real' },
  1319. Vibrance => { Writable => 'real', Avoid => 1 },
  1320. Curve0x => { Writable => 'real' },
  1321. Curve0y => { Writable => 'real' },
  1322. Curve1x => { Writable => 'real' },
  1323. Curve1y => { Writable => 'real' },
  1324. Curve2x => { Writable => 'real' },
  1325. Curve2y => { Writable => 'real' },
  1326. Curve3x => { Writable => 'real' },
  1327. Curve3y => { Writable => 'real' },
  1328. Curve4x => { Writable => 'real' },
  1329. Curve4y => { Writable => 'real' },
  1330. Shadows => { Writable => 'real', Avoid => 1 },
  1331. Highlights => { Writable => 'real', Avoid => 1 },
  1332. );
  1333. # Adobe creatorAtom properties (ref PH)
  1334. %Image::ExifTool::XMP::creatorAtom = (
  1335. %xmpTableDefaults,
  1336. GROUPS => { 1 => 'XMP-creatorAtom', 2 => 'Image' },
  1337. NAMESPACE => 'creatorAtom',
  1338. NOTES => 'Adobe creatorAtom tags, written by After Effects.',
  1339. macAtom => {
  1340. Struct => {
  1341. STRUCT_NAME => 'MacAtom',
  1342. NAMESPACE => 'creatorAtom',
  1343. applicationCode => { },
  1344. invocationAppleEvent => { },
  1345. posixProjectPath => { },
  1346. },
  1347. },
  1348. windowsAtom => {
  1349. Struct => {
  1350. STRUCT_NAME => 'WindowsAtom',
  1351. NAMESPACE => 'creatorAtom',
  1352. extension => { },
  1353. invocationFlags => { },
  1354. uncProjectPath => { },
  1355. },
  1356. },
  1357. aeProjectLink => { # (After Effects Project Link)
  1358. Struct => {
  1359. STRUCT_NAME => 'AEProjectLink',
  1360. NAMESPACE => 'creatorAtom',
  1361. renderTimeStamp => { Writable => 'integer' },
  1362. compositionID => { },
  1363. renderQueueItemID => { },
  1364. renderOutputModuleIndex => { },
  1365. fullPath => { },
  1366. },
  1367. },
  1368. );
  1369. # FastPictureViewer namespace properties (http://www.fastpictureviewer.com/help/#rtfcomments)
  1370. %Image::ExifTool::XMP::fpv = (
  1371. %xmpTableDefaults,
  1372. GROUPS => { 1 => 'XMP-fpv', 2 => 'Image' },
  1373. NAMESPACE => 'fpv',
  1374. NOTES => q{
  1375. Fast Picture Viewer tags (see
  1376. L<http://www.fastpictureviewer.com/help/#rtfcomments>).
  1377. },
  1378. RichTextComment => { },
  1379. );
  1380. # Apple FaceInfo namespace properties (ref PH)
  1381. %Image::ExifTool::XMP::apple_fi = (
  1382. %xmpTableDefaults,
  1383. GROUPS => { 1 => 'XMP-apple-fi', 2 => 'Image' },
  1384. NAMESPACE => 'apple-fi',
  1385. NOTES => q{
  1386. Face information tags written by the Apple iPhone 5 inside the mwg-rs
  1387. RegionExtensions.
  1388. },
  1389. Timestamp => {
  1390. Name => 'TimeStamp',
  1391. Writable => 'integer',
  1392. # (don't know how to convert this)
  1393. },
  1394. FaceID => { Writable => 'integer' },
  1395. AngleInfoRoll => { Writable => 'integer' },
  1396. AngleInfoYaw => { Writable => 'integer' },
  1397. ConfidenceLevel => { Writable => 'integer' },
  1398. );
  1399. # Google panorama namespace properties
  1400. # (ref http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,4569.0.html)
  1401. %Image::ExifTool::XMP::GPano = (
  1402. %xmpTableDefaults,
  1403. GROUPS => { 1 => 'XMP-GPano', 2 => 'Image' },
  1404. NAMESPACE => 'GPano',
  1405. NOTES => q{
  1406. Panorama tags written by Google Photosphere. See
  1407. L<https://developers.google.com/panorama/metadata/> for the specification.
  1408. },
  1409. UsePanoramaViewer => { Writable => 'boolean' },
  1410. CaptureSoftware => { },
  1411. StitchingSoftware => { },
  1412. ProjectionType => { },
  1413. PoseHeadingDegrees => { Writable => 'real' },
  1414. PosePitchDegrees => { Writable => 'real' },
  1415. PoseRollDegrees => { Writable => 'real' },
  1416. InitialViewHeadingDegrees => { Writable => 'integer' },
  1417. InitialViewPitchDegrees => { Writable => 'integer' },
  1418. InitialViewRollDegrees => { Writable => 'integer' },
  1419. InitialHorizontalFOVDegrees => { Writable => 'real' },
  1420. FirstPhotoDate => { %dateTimeInfo, Groups => { 2 => 'Time' } },
  1421. LastPhotoDate => { %dateTimeInfo, Groups => { 2 => 'Time' } },
  1422. SourcePhotosCount => { Writable => 'integer' },
  1423. ExposureLockUsed => { Writable => 'boolean' },
  1424. CroppedAreaImageWidthPixels => { Writable => 'integer' },
  1425. CroppedAreaImageHeightPixels => { Writable => 'integer' },
  1426. FullPanoWidthPixels => { Writable => 'integer' },
  1427. FullPanoHeightPixels => { Writable => 'integer' },
  1428. CroppedAreaLeftPixels => { Writable => 'integer' },
  1429. CroppedAreaTopPixels => { Writable => 'integer' },
  1430. # (the following have been observed, but are not in the specification)
  1431. LargestValidInteriorRectLeft => { Writable => 'integer' },
  1432. LargestValidInteriorRectTop => { Writable => 'integer' },
  1433. LargestValidInteriorRectWidth => { Writable => 'integer' },
  1434. LargestValidInteriorRectHeight => { Writable => 'integer' },
  1435. );
  1436. # Getty Images namespace (ref PH)
  1437. %Image::ExifTool::XMP::GettyImages = (
  1438. %xmpTableDefaults,
  1439. GROUPS => { 1 => 'XMP-getty', 2 => 'Image' },
  1440. NAMESPACE => 'GettyImagesGIFT',
  1441. NOTES => q{
  1442. The actual Getty Images namespace prefix is "GettyImagesGIFT", which is the
  1443. prefix recorded in the file, but ExifTool shortens this for the "XMP-getty"
  1444. family 1 group name.
  1445. },
  1446. Personality => { },
  1447. OriginalFilename => { Name => 'OriginalFileName' },
  1448. ParentMEID => { },
  1449. );
  1450. # SVG namespace properties (ref 9)
  1451. %Image::ExifTool::XMP::SVG = (
  1452. GROUPS => { 0 => 'SVG', 1 => 'SVG', 2 => 'Image' },
  1453. NAMESPACE => 'svg',
  1454. LANG_INFO => \&GetLangInfo,
  1455. NOTES => q{
  1456. SVG (Scalable Vector Graphics) image tags. By default, only the top-level
  1457. SVG and Metadata tags are extracted from these images, but all graphics tags
  1458. may be extracted by setting the Unknown option to 2 (-U on the command
  1459. line). The SVG tags are not part of XMP as such, but are included with the
  1460. XMP module for convenience. (see L<http://www.w3.org/TR/SVG11/>)
  1461. },
  1462. version => 'SVGVersion',
  1463. id => 'ID',
  1464. metadataId => 'MetadataID',
  1465. width => {
  1466. Name => 'ImageWidth',
  1467. ValueConv => '$val =~ s/px$//; $val',
  1468. },
  1469. height => {
  1470. Name => 'ImageHeight',
  1471. ValueConv => '$val =~ s/px$//; $val',
  1472. },
  1473. );
  1474. # table to add tags in other namespaces
  1475. %Image::ExifTool::XMP::otherSVG = (
  1476. GROUPS => { 0 => 'SVG', 2 => 'Unknown' },
  1477. LANG_INFO => \&GetLangInfo,
  1478. NAMESPACE => undef, # variable namespace
  1479. );
  1480. # set "Avoid" flag for all PRISM tags
  1481. my ($table, $key);
  1482. foreach $table (
  1483. \%Image::ExifTool::XMP::prism,
  1484. \%Image::ExifTool::XMP::prl,
  1485. \%Image::ExifTool::XMP::pur,
  1486. \%Image::ExifTool::XMP::pmi,
  1487. \%Image::ExifTool::XMP::prm)
  1488. {
  1489. foreach $key (TagTableKeys($table)) {
  1490. $$table{$key}{Avoid} = 1;
  1491. }
  1492. }
  1493. 1; #end
  1494. __END__
  1495. =head1 NAME
  1496. Image::ExifTool::XMP2.pl - Additional XMP namespace definitions
  1497. =head1 SYNOPSIS
  1498. This module is loaded automatically by Image::ExifTool when required.
  1499. =head1 DESCRIPTION
  1500. This file contains definitions for less common XMP namespaces.
  1501. =head1 AUTHOR
  1502. Copyright 2003-2016, Phil Harvey (phil at owl.phy.queensu.ca)
  1503. This library is free software; you can redistribute it and/or modify it
  1504. under the same terms as Perl itself.
  1505. =head1 REFERENCES
  1506. =over 4
  1507. =item L<http://ns.useplus.org/>
  1508. =item L<http://www.prismstandard.org/>
  1509. =item L<http://www.portfoliofaq.com/pfaq/v7mappings.htm>
  1510. =item L<http://creativecommons.org/technology/xmp>
  1511. =item L<http://www.optimasc.com/products/fileid/xmp-extensions.pdf>
  1512. =item L<http://www.w3.org/TR/SVG11/>
  1513. =back
  1514. =head1 SEE ALSO
  1515. L<Image::ExifTool::TagNames/XMP Tags>,
  1516. L<Image::ExifTool(3pm)|Image::ExifTool>
  1517. =cut