MediaWiki  REL1_20
XMPInfo.php
Go to the documentation of this file.
00001 <?php
00029 class XMPInfo {
00030 
00034         public static function getItems ( ) {
00035                 if( !self::$ranHooks ) {
00036                         // This is for if someone makes a custom metadata extension.
00037                         // For example, a medical wiki might want to decode DICOM xmp properties.
00038                         wfRunHooks('XMPGetInfo', Array(&self::$items));
00039                         self::$ranHooks = true; // Only want to do this once.
00040                 }
00041                 return self::$items;
00042         }
00043 
00044         static private $ranHooks = false;
00045 
00067         static private $items = array(
00068                 'http://ns.adobe.com/exif/1.0/' => array(
00069                         'ApertureValue' => array(
00070                                 'map_group' => 'exif',
00071                                 'mode'      => XMPReader::MODE_SIMPLE,
00072                                 'validate'  => 'validateRational'
00073                         ),
00074                         'BrightnessValue' => array(
00075                                 'map_group' => 'exif',
00076                                 'mode'      => XMPReader::MODE_SIMPLE,
00077                                 'validate'  => 'validateRational'
00078                         ),
00079                         'CompressedBitsPerPixel' => array(
00080                                 'map_group' => 'exif',
00081                                 'mode'      => XMPReader::MODE_SIMPLE,
00082                                 'validate'  => 'validateRational'
00083                         ),
00084                         'DigitalZoomRatio' => array(
00085                                 'map_group' => 'exif',
00086                                 'mode'      => XMPReader::MODE_SIMPLE,
00087                                 'validate'  => 'validateRational'
00088                         ),
00089                         'ExposureBiasValue' => array(
00090                                 'map_group' => 'exif',
00091                                 'mode'      => XMPReader::MODE_SIMPLE,
00092                                 'validate'  => 'validateRational'
00093                         ),
00094                         'ExposureIndex' => array(
00095                                 'map_group' => 'exif',
00096                                 'mode'      => XMPReader::MODE_SIMPLE,
00097                                 'validate'  => 'validateRational'
00098                         ),
00099                         'ExposureTime' => array(
00100                                 'map_group' => 'exif',
00101                                 'mode'      => XMPReader::MODE_SIMPLE,
00102                                 'validate'  => 'validateRational'
00103                         ),
00104                         'FlashEnergy' => array(
00105                                 'map_group' => 'exif',
00106                                 'mode'      => XMPReader::MODE_SIMPLE,
00107                                 'validate'  => 'validateRational',
00108                         ),
00109                         'FNumber' => array(
00110                                 'map_group' => 'exif',
00111                                 'mode'      => XMPReader::MODE_SIMPLE,
00112                                 'validate'  => 'validateRational'
00113                         ),
00114                         'FocalLength' => array(
00115                                 'map_group' => 'exif',
00116                                 'mode'      => XMPReader::MODE_SIMPLE,
00117                                 'validate'  => 'validateRational'
00118                         ),
00119                         'FocalPlaneXResolution' => array(
00120                                 'map_group' => 'exif',
00121                                 'mode'      => XMPReader::MODE_SIMPLE,
00122                                 'validate'  => 'validateRational'
00123                         ),
00124                         'FocalPlaneYResolution' => array(
00125                                 'map_group' => 'exif',
00126                                 'mode'      => XMPReader::MODE_SIMPLE,
00127                                 'validate'  => 'validateRational'
00128                         ),
00129                         'GPSAltitude' => array(
00130                                 'map_group' => 'exif',
00131                                 'mode'      => XMPReader::MODE_SIMPLE,
00132                                 'validate'  => 'validateRational',
00133                         ),
00134                         'GPSDestBearing' => array(
00135                                 'map_group' => 'exif',
00136                                 'mode'      => XMPReader::MODE_SIMPLE,
00137                                 'validate'  => 'validateRational'
00138                         ),
00139                         'GPSDestDistance' => array(
00140                                 'map_group' => 'exif',
00141                                 'mode'      => XMPReader::MODE_SIMPLE,
00142                                 'validate'  => 'validateRational'
00143                         ),
00144                         'GPSDOP' => array(
00145                                 'map_group' => 'exif',
00146                                 'mode'      => XMPReader::MODE_SIMPLE,
00147                                 'validate'  => 'validateRational'
00148                         ),
00149                         'GPSImgDirection' => array(
00150                                 'map_group' => 'exif',
00151                                 'mode'      => XMPReader::MODE_SIMPLE,
00152                                 'validate'  => 'validateRational'
00153                         ),
00154                         'GPSSpeed' => array(
00155                                 'map_group' => 'exif',
00156                                 'mode'      => XMPReader::MODE_SIMPLE,
00157                                 'validate'  => 'validateRational'
00158                         ),
00159                         'GPSTrack' => array(
00160                                 'map_group' => 'exif',
00161                                 'mode'      => XMPReader::MODE_SIMPLE,
00162                                 'validate'  => 'validateRational'
00163                         ),
00164                         'MaxApertureValue'  => array(
00165                                 'map_group' => 'exif',
00166                                 'mode'      => XMPReader::MODE_SIMPLE,
00167                                 'validate'  => 'validateRational'
00168                         ),
00169                         'ShutterSpeedValue' => array(
00170                                 'map_group' => 'exif',
00171                                 'mode'      => XMPReader::MODE_SIMPLE,
00172                                 'validate'  => 'validateRational'
00173                         ),
00174                         'SubjectDistance'   => array(
00175                                 'map_group' => 'exif',
00176                                 'mode'      => XMPReader::MODE_SIMPLE,
00177                                 'validate'  => 'validateRational'
00178                         ),
00179                         /* Flash */
00180                         'Flash'             => array(
00181                                 'mode'      => XMPReader::MODE_STRUCT,
00182                                 'children'  => array(
00183                                         'Fired'      => true,
00184                                         'Function'   => true,
00185                                         'Mode'       => true,
00186                                         'RedEyeMode' => true,
00187                                         'Return'     => true,
00188                                 ),
00189                                 'validate'  => 'validateFlash',
00190                                 'map_group' => 'exif',
00191                         ),
00192                         'Fired'             => array(
00193                                 'map_group' => 'exif',
00194                                 'validate'  => 'validateBoolean',
00195                                 'mode'      => XMPReader::MODE_SIMPLE,
00196                                 'structPart'=> true,
00197                         ),
00198                         'Function'          => array(
00199                                 'map_group' => 'exif',
00200                                 'validate'  => 'validateBoolean',
00201                                 'mode'      => XMPReader::MODE_SIMPLE,
00202                                 'structPart'=> true,
00203                         ),
00204                         'Mode'              => array(
00205                                 'map_group' => 'exif',
00206                                 'validate'  => 'validateClosed',
00207                                 'mode'      => XMPReader::MODE_SIMPLE,
00208                                 'choices'   => array( '0' => true, '1' => true,
00209                                                 '2' => true, '3' => true ),
00210                                 'structPart'=> true,
00211                         ),
00212                         'Return'            => array(
00213                                 'map_group' => 'exif',
00214                                 'validate'  => 'validateClosed',
00215                                 'mode'      => XMPReader::MODE_SIMPLE,
00216                                 'choices'   => array( '0' => true,
00217                                                 '2' => true, '3' => true ),
00218                                 'structPart'=> true,
00219                         ),
00220                         'RedEyeMode'        => array(
00221                                 'map_group' => 'exif',
00222                                 'validate'  => 'validateBoolean',
00223                                 'mode'      => XMPReader::MODE_SIMPLE,
00224                                 'structPart'=> true,
00225                         ),
00226                         /* End Flash */
00227                         'ISOSpeedRatings'   => array(
00228                                 'map_group' => 'exif',
00229                                 'mode'      => XMPReader::MODE_SEQ,
00230                                 'validate'  => 'validateInteger'
00231                         ),
00232                         /* end rational things */
00233                         'ColorSpace'   => array(
00234                                 'map_group' => 'exif',
00235                                 'mode'      => XMPReader::MODE_SIMPLE,
00236                                 'validate'  => 'validateClosed',
00237                                 'choices'   => array( '1' => true, '65535' => true ),
00238                         ),
00239                         'ComponentsConfiguration'   => array(
00240                                 'map_group' => 'exif',
00241                                 'mode'      => XMPReader::MODE_SEQ,
00242                                 'validate'  => 'validateClosed',
00243                                 'choices'   => array( '1' => true, '2' => true, '3' => true, '4' => true,
00244                                                 '5' => true, '6' => true )
00245                         ),
00246                         'Contrast'          => array(
00247                                 'map_group' => 'exif',
00248                                 'mode'      => XMPReader::MODE_SIMPLE,
00249                                 'validate'  => 'validateClosed',
00250                                 'choices'   => array( '0' => true, '1' => true, '2' => true )
00251                         ),
00252                         'CustomRendered'    => array(
00253                                 'map_group' => 'exif',
00254                                 'mode'      => XMPReader::MODE_SIMPLE,
00255                                 'validate'  => 'validateClosed',
00256                                 'choices'   => array( '0' => true, '1' => true )
00257                         ),
00258                         'DateTimeOriginal'  => array(
00259                                 'map_group' => 'exif',
00260                                 'mode'      => XMPReader::MODE_SIMPLE,
00261                                 'validate'  => 'validateDate',
00262                         ),
00263                         'DateTimeDigitized' => array(  /* xmp:CreateDate */
00264                                 'map_group' => 'exif',
00265                                 'mode'      => XMPReader::MODE_SIMPLE,
00266                                 'validate'  => 'validateDate',
00267                         ),
00268                         /* todo: there might be interesting information in
00269                          * exif:DeviceSettingDescription, but need to find an
00270                          * example
00271                          */
00272                         'ExifVersion'       => array(
00273                                 'map_group' => 'exif',
00274                                 'mode'      => XMPReader::MODE_SIMPLE,
00275                         ),
00276                         'ExposureMode'      => array(
00277                                 'map_group' => 'exif',
00278                                 'mode'      => XMPReader::MODE_SIMPLE,
00279                                 'validate'  => 'validateClosed',
00280                                 'rangeLow'  => 0,
00281                                 'rangeHigh' => 2,
00282                         ),
00283                         'ExposureProgram'   => array(
00284                                 'map_group' => 'exif',
00285                                 'mode'      => XMPReader::MODE_SIMPLE,
00286                                 'validate'  => 'validateClosed',
00287                                 'rangeLow'  => 0,
00288                                 'rangeHigh' => 8,
00289                         ),
00290                         'FileSource'        => array(
00291                                 'map_group' => 'exif',
00292                                 'mode'      => XMPReader::MODE_SIMPLE,
00293                                 'validate'  => 'validateClosed',
00294                                 'choices'   => array( '3' => true )
00295                         ),
00296                         'FlashpixVersion'   => array(
00297                                 'map_group' => 'exif',
00298                                 'mode'      => XMPReader::MODE_SIMPLE,
00299                         ),
00300                         'FocalLengthIn35mmFilm' => array(
00301                                 'map_group' => 'exif',
00302                                 'mode'      => XMPReader::MODE_SIMPLE,
00303                                 'validate'  => 'validateInteger',
00304                         ),
00305                         'FocalPlaneResolutionUnit' => array(
00306                                 'map_group' => 'exif',
00307                                 'mode'      => XMPReader::MODE_SIMPLE,
00308                                 'validate'  => 'validateClosed',
00309                                 'choices'   => array( '2' => true, '3' => true ),
00310                         ),
00311                         'GainControl'       => array(
00312                                 'map_group' => 'exif',
00313                                 'mode'      => XMPReader::MODE_SIMPLE,
00314                                 'validate'  => 'validateClosed',
00315                                 'rangeLow'  => 0,
00316                                 'rangeHigh' => 4,
00317                         ),
00318                         /* this value is post-processed out later */
00319                         'GPSAltitudeRef'    => array(
00320                                 'map_group' => 'exif',
00321                                 'mode'      => XMPReader::MODE_SIMPLE,
00322                                 'validate'  => 'validateClosed',
00323                                 'choices'   => array( '0' => true, '1' => true ),
00324                         ),
00325                         'GPSAreaInformation' => array(
00326                                 'map_group' => 'exif',
00327                                 'mode'      => XMPReader::MODE_SIMPLE,
00328                         ),
00329                         'GPSDestBearingRef' => array(
00330                                 'map_group' => 'exif',
00331                                 'mode'      => XMPReader::MODE_SIMPLE,
00332                                 'validate'  => 'validateClosed',
00333                                 'choices'   => array( 'T' => true, 'M' => true ),
00334                         ),
00335                         'GPSDestDistanceRef' => array(
00336                                 'map_group' => 'exif',
00337                                 'mode'      => XMPReader::MODE_SIMPLE,
00338                                 'validate'  => 'validateClosed',
00339                                 'choices'   => array( 'K' => true, 'M' => true,
00340                                                 'N' => true ),
00341                         ),
00342                         'GPSDestLatitude'   => array(
00343                                 'map_group' => 'exif',
00344                                 'mode'      => XMPReader::MODE_SIMPLE,
00345                                 'validate'  => 'validateGPS',
00346                         ),
00347                         'GPSDestLongitude'  => array(
00348                                 'map_group' => 'exif',
00349                                 'mode'      => XMPReader::MODE_SIMPLE,
00350                                 'validate'  => 'validateGPS',
00351                         ),
00352                         'GPSDifferential'   => array(
00353                                 'map_group' => 'exif',
00354                                 'mode'      => XMPReader::MODE_SIMPLE,
00355                                 'validate'  => 'validateClosed',
00356                                 'choices'   => array( '0' => true, '1' => true ),
00357                         ),
00358                         'GPSImgDirectionRef' => array(
00359                                 'map_group'  => 'exif',
00360                                 'mode'       => XMPReader::MODE_SIMPLE,
00361                                 'validate'   => 'validateClosed',
00362                                 'choices'    => array( 'T' => true, 'M' => true ),
00363                         ),
00364                         'GPSLatitude'       => array(
00365                                 'map_group' => 'exif',
00366                                 'mode'      => XMPReader::MODE_SIMPLE,
00367                                 'validate'  => 'validateGPS',
00368                         ),
00369                         'GPSLongitude'      => array(
00370                                 'map_group' => 'exif',
00371                                 'mode'      => XMPReader::MODE_SIMPLE,
00372                                 'validate'  => 'validateGPS',
00373                         ),
00374                         'GPSMapDatum'       => array(
00375                                 'map_group' => 'exif',
00376                                 'mode'      => XMPReader::MODE_SIMPLE,
00377                         ),
00378                         'GPSMeasureMode'    => array(
00379                                 'map_group' => 'exif',
00380                                 'mode'      => XMPReader::MODE_SIMPLE,
00381                                 'validate'  => 'validateClosed',
00382                                 'choices'   => array( '2' => true, '3' => true )
00383                         ),
00384                         'GPSProcessingMethod' => array(
00385                                 'map_group' => 'exif',
00386                                 'mode'      => XMPReader::MODE_SIMPLE,
00387                         ),
00388                         'GPSSatellites'     => array(
00389                                 'map_group' => 'exif',
00390                                 'mode'      => XMPReader::MODE_SIMPLE,
00391                         ),
00392                         'GPSSpeedRef'       => array(
00393                                 'map_group' => 'exif',
00394                                 'mode'      => XMPReader::MODE_SIMPLE,
00395                                 'validate'  => 'validateClosed',
00396                                 'choices'   => array( 'K' => true, 'M' => true,
00397                                                 'N' => true ),
00398                         ),
00399                         'GPSStatus'         => array(
00400                                 'map_group' => 'exif',
00401                                 'mode'      => XMPReader::MODE_SIMPLE,
00402                                 'validate'  => 'validateClosed',
00403                                 'choices'   => array( 'A' => true, 'V' => true )
00404                         ),
00405                         'GPSTimeStamp'      => array(
00406                                 'map_group' => 'exif',
00407                                 // Note: in exif, GPSDateStamp does not include
00408                                 // the time, where here it does.
00409                                 'map_name'  => 'GPSDateStamp',
00410                                 'mode'      => XMPReader::MODE_SIMPLE,
00411                                 'validate'  => 'validateDate',
00412                         ),
00413                         'GPSTrackRef'       => array(
00414                                 'map_group' => 'exif',
00415                                 'mode'      => XMPReader::MODE_SIMPLE,
00416                                 'validate'  => 'validateClosed',
00417                                 'choices'   => array( 'T' => true, 'M' => true )
00418                         ),
00419                         'GPSVersionID'      => array(
00420                                 'map_group' => 'exif',
00421                                 'mode'      => XMPReader::MODE_SIMPLE,
00422                         ),
00423                         'ImageUniqueID'     => array(
00424                                 'map_group' => 'exif',
00425                                 'mode'      => XMPReader::MODE_SIMPLE,
00426                         ),
00427                         'LightSource'       => array(
00428                                 'map_group' => 'exif',
00429                                 'mode'      => XMPReader::MODE_SIMPLE,
00430                                 'validate'  => 'validateClosed',
00431                                 /* can't use a range, as it skips... */
00432                                 'choices'   =>  array( '0' => true, '1' => true,
00433                                         '2' => true, '3' => true, '4' => true,
00434                                         '9' => true, '10' => true, '11' => true,
00435                                         '12' => true, '13' => true,
00436                                         '14' => true, '15' => true,
00437                                         '17' => true, '18' => true,
00438                                         '19' => true, '20' => true,
00439                                         '21' => true, '22' => true,
00440                                         '23' => true, '24' => true,
00441                                         '255' => true,
00442                                 ),
00443                         ),
00444                         'MeteringMode'      => array(
00445                                 'map_group' => 'exif',
00446                                 'mode'      => XMPReader::MODE_SIMPLE,
00447                                 'validate'  => 'validateClosed',
00448                                 'rangeLow'  => 0,
00449                                 'rangeHigh' => 6,
00450                                 'choices'   => array( '255' => true ),
00451                         ),
00452                         /* Pixel(X|Y)Dimension are rather useless, but for
00453                          * completeness since we do it with exif.
00454                          */
00455                         'PixelXDimension'   => array(
00456                                 'map_group' => 'exif',
00457                                 'mode'      => XMPReader::MODE_SIMPLE,
00458                                 'validate'  => 'validateInteger',
00459                         ),
00460                         'PixelYDimension'   => array(
00461                                 'map_group' => 'exif',
00462                                 'mode'      => XMPReader::MODE_SIMPLE,
00463                                 'validate'  => 'validateInteger',
00464                         ),
00465                         'Saturation'        => array(
00466                                 'map_group' => 'exif',
00467                                 'mode'      => XMPReader::MODE_SIMPLE,
00468                                 'validate'  => 'validateClosed',
00469                                 'rangeLow'  => 0,
00470                                 'rangeHigh' => 2,
00471                         ),
00472                         'SceneCaptureType'  => array(
00473                                 'map_group' => 'exif',
00474                                 'mode'      => XMPReader::MODE_SIMPLE,
00475                                 'validate'  => 'validateClosed',
00476                                 'rangeLow'  => 0,
00477                                 'rangeHigh' => 3,
00478                         ),
00479                         'SceneType'         => array(
00480                                 'map_group' => 'exif',
00481                                 'mode'      => XMPReader::MODE_SIMPLE,
00482                                 'validate'  => 'validateClosed',
00483                                 'choices'   => array( '1' => true ),
00484                         ),
00485                         // Note, 6 is not valid SensingMethod.
00486                         'SensingMethod'     => array(
00487                                 'map_group' => 'exif',
00488                                 'mode'      => XMPReader::MODE_SIMPLE,
00489                                 'validate'  => 'validateClosed',
00490                                 'rangeLow'  => 1,
00491                                 'rangeHigh' => 5,
00492                                 'choices'   => array( '7' => true, 8 => true ),
00493                         ),
00494                         'Sharpness'         => array(
00495                                 'map_group' => 'exif',
00496                                 'mode'      => XMPReader::MODE_SIMPLE,
00497                                 'validate'  => 'validateClosed',
00498                                 'rangeLow'  => 0,
00499                                 'rangeHigh' => 2,
00500                         ),
00501                         'SpectralSensitivity' => array(
00502                                 'map_group' => 'exif',
00503                                 'mode'      => XMPReader::MODE_SIMPLE,
00504                         ),
00505                         // This tag should perhaps be displayed to user better.
00506                         'SubjectArea'       => array(
00507                                 'map_group' => 'exif',
00508                                 'mode'      => XMPReader::MODE_SEQ,
00509                                 'validate'  => 'validateInteger',
00510                         ),
00511                         'SubjectDistanceRange' => array(
00512                                 'map_group' => 'exif',
00513                                 'mode'      => XMPReader::MODE_SIMPLE,
00514                                 'validate'  => 'validateClosed',
00515                                 'rangeLow'  => 0,
00516                                 'rangeHigh' => 3,
00517                         ),
00518                         'SubjectLocation'   => array(
00519                                 'map_group' => 'exif',
00520                                 'mode'      => XMPReader::MODE_SEQ,
00521                                 'validate'  => 'validateInteger',
00522                         ),
00523                         'UserComment'       => array(
00524                                 'map_group' => 'exif',
00525                                 'mode'      => XMPReader::MODE_LANG,
00526                         ),
00527                         'WhiteBalance'      => array(
00528                                 'map_group' => 'exif',
00529                                 'mode'      => XMPReader::MODE_SIMPLE,
00530                                 'validate'  => 'validateClosed',
00531                                 'choices'   => array( '0' => true, '1' => true )
00532                         ),
00533                 ),
00534                 'http://ns.adobe.com/tiff/1.0/' => array(
00535                         'Artist'            => array(
00536                                 'map_group' => 'exif',
00537                                 'mode'      => XMPReader::MODE_SIMPLE,
00538                         ),
00539                         'BitsPerSample'     => array(
00540                                 'map_group' => 'exif',
00541                                 'mode'      => XMPReader::MODE_SEQ,
00542                                 'validate'  => 'validateInteger',
00543                         ),
00544                         'Compression'       => array(
00545                                 'map_group' => 'exif',
00546                                 'mode'      => XMPReader::MODE_SIMPLE,
00547                                 'validate'  => 'validateClosed',
00548                                 'choices'   => array( '1' => true, '6' => true ),
00549                         ),
00550                         /* this prop should not be used in XMP. dc:rights is the correct prop */
00551                         'Copyright'         => array(
00552                                 'map_group' => 'exif',
00553                                 'mode'      => XMPReader::MODE_LANG,
00554                         ),
00555                         'DateTime'          => array(  /* proper prop is xmp:ModifyDate */
00556                                 'map_group' => 'exif',
00557                                 'mode'      => XMPReader::MODE_SIMPLE,
00558                                 'validate'  => 'validateDate',
00559                         ),
00560                         'ImageDescription'  => array(  /* proper one is dc:description */
00561                                 'map_group' => 'exif',
00562                                 'mode'      => XMPReader::MODE_LANG,
00563                         ),
00564                         'ImageLength'       => array(
00565                                 'map_group' => 'exif',
00566                                 'mode'      => XMPReader::MODE_SIMPLE,
00567                                 'validate'  => 'validateInteger',
00568                         ),
00569                         'ImageWidth'        => array(
00570                                 'map_group' => 'exif',
00571                                 'mode'      => XMPReader::MODE_SIMPLE,
00572                                 'validate'  => 'validateInteger',
00573                         ),
00574                         'Make'              => array(
00575                                 'map_group' => 'exif',
00576                                 'mode'      => XMPReader::MODE_SIMPLE,
00577                         ),
00578                         'Model'             => array(
00579                                 'map_group' => 'exif',
00580                                 'mode'      => XMPReader::MODE_SIMPLE,
00581                         ),
00582                         /**** Do not extract this property
00583                          * It interferes with auto exif rotation.
00584                          * 'Orientation'       => array(
00585                          *      'map_group' => 'exif',
00586                          *      'mode'      => XMPReader::MODE_SIMPLE,
00587                          *      'validate'  => 'validateClosed',
00588                          *      'choices'   => array( '1' => true, '2' => true, '3' => true, '4' => true, 5 => true,
00589                          *                      '6' => true, '7' => true, '8' => true ),
00590                          *),
00591                          ******/
00592                         'PhotometricInterpretation' => array(
00593                                 'map_group' => 'exif',
00594                                 'mode'      => XMPReader::MODE_SIMPLE,
00595                                 'validate'  => 'validateClosed',
00596                                 'choices'   => array( '2' => true, '6' => true ),
00597                         ),
00598                         'PlanerConfiguration' => array(
00599                                 'map_group' => 'exif',
00600                                 'mode'      => XMPReader::MODE_SIMPLE,
00601                                 'validate'  => 'validateClosed',
00602                                 'choices'   => array( '1' => true, '2' => true ),
00603                         ),
00604                         'PrimaryChromaticities' => array(
00605                                 'map_group' => 'exif',
00606                                 'mode'      => XMPReader::MODE_SEQ,
00607                                 'validate'  => 'validateRational',
00608                         ),
00609                         'ReferenceBlackWhite' => array(
00610                                 'map_group' => 'exif',
00611                                 'mode'      => XMPReader::MODE_SEQ,
00612                                 'validate'  => 'validateRational',
00613                         ),
00614                         'ResolutionUnit'    => array(
00615                                 'map_group' => 'exif',
00616                                 'mode'      => XMPReader::MODE_SIMPLE,
00617                                 'validate'  => 'validateClosed',
00618                                 'choices'   => array( '2' => true, '3' => true ),
00619                         ),
00620                         'SamplesPerPixel'   => array(
00621                                 'map_group' => 'exif',
00622                                 'mode'      => XMPReader::MODE_SIMPLE,
00623                                 'validate'  => 'validateInteger',
00624                         ),
00625                         'Software'          => array(  /* see xmp:CreatorTool */
00626                                 'map_group' => 'exif',
00627                                 'mode'      => XMPReader::MODE_SIMPLE,
00628                         ),
00629                         /* ignore TransferFunction */
00630                         'WhitePoint'        => array(
00631                                 'map_group' => 'exif',
00632                                 'mode'      => XMPReader::MODE_SEQ,
00633                                 'validate'  => 'validateRational',
00634                         ),
00635                         'XResolution'       => array(
00636                                 'map_group' => 'exif',
00637                                 'mode'      => XMPReader::MODE_SIMPLE,
00638                                 'validate'  => 'validateRational',
00639                         ),
00640                         'YResolution'       => array(
00641                                 'map_group' => 'exif',
00642                                 'mode'      => XMPReader::MODE_SIMPLE,
00643                                 'validate'  => 'validateRational',
00644                         ),
00645                         'YCbCrCoefficients' => array(
00646                                 'map_group' => 'exif',
00647                                 'mode'      => XMPReader::MODE_SEQ,
00648                                 'validate'  => 'validateRational',
00649                         ),
00650                         'YCbCrPositioning'  => array(
00651                                 'map_group' => 'exif',
00652                                 'mode'      => XMPReader::MODE_SIMPLE,
00653                                 'validate'  => 'validateClosed',
00654                                 'choices'   => array( '1' => true, '2' => true ),
00655                         ),
00656                         /********
00657                          * Disable extracting this property (bug 31944)
00658                          * Several files have a string instead of a Seq
00659                          * for this property. XMPReader doesn't handle
00660                          * mismatched types very gracefully (it marks
00661                          * the entire file as invalid, instead of just
00662                          * the relavent prop). Since this prop
00663                          * doesn't communicate all that useful information
00664                          * just disable this prop for now, until such
00665                          * XMPReader is more graceful (bug 32172)
00666                          * 'YCbCrSubSampling'  => array(
00667                          *      'map_group' => 'exif',
00668                          *      'mode'      => XMPReader::MODE_SEQ,
00669                          *      'validate'  => 'validateClosed',
00670                          *      'choices'   => array( '1' => true, '2' => true ),
00671                          * ),
00672                          */ 
00673                 ),
00674                 'http://ns.adobe.com/exif/1.0/aux/' => array(
00675                         'Lens'              => array(
00676                                 'map_group' => 'exif',
00677                                 'mode'      => XMPReader::MODE_SIMPLE,
00678                         ),
00679                         'SerialNumber'      => array(
00680                                 'map_group' => 'exif',
00681                                 'mode'      => XMPReader::MODE_SIMPLE,
00682                         ),
00683                         'OwnerName'         => array(
00684                                 'map_group' => 'exif',
00685                                 'map_name'  => 'CameraOwnerName',
00686                                 'mode'      => XMPReader::MODE_SIMPLE,
00687                         ),
00688                 ),
00689                 'http://purl.org/dc/elements/1.1/' => array(
00690                         'title'             => array(
00691                                 'map_group' => 'general',
00692                                 'map_name'  => 'ObjectName',
00693                                 'mode'      => XMPReader::MODE_LANG
00694                         ),
00695                         'description'       => array(
00696                                 'map_group' => 'general',
00697                                 'map_name'  => 'ImageDescription',
00698                                 'mode'      => XMPReader::MODE_LANG
00699                         ),
00700                         'contributor'       => array(
00701                                 'map_group' => 'general',
00702                                 'map_name'  => 'dc-contributor',
00703                                 'mode'      => XMPReader::MODE_BAG
00704                         ),
00705                         'coverage'          => array(
00706                                 'map_group' => 'general',
00707                                 'map_name'  => 'dc-coverage',
00708                                 'mode'      => XMPReader::MODE_SIMPLE,
00709                         ),
00710                         'creator'           => array(
00711                                 'map_group' => 'general',
00712                                 'map_name'  => 'Artist', //map with exif Artist, iptc byline (2:80)
00713                                 'mode'      => XMPReader::MODE_SEQ,
00714                         ),
00715                         'date'              => array(
00716                                 'map_group' => 'general',
00717                                 // Note, not mapped with other date properties, as this type of date is
00718                                 // non-specific: "A point or period of time associated with an event in
00719                                 //  the lifecycle of the resource"
00720                                 'map_name'  => 'dc-date',
00721                                 'mode'      => XMPReader::MODE_SEQ,
00722                                 'validate'  => 'validateDate',
00723                         ),
00724                         /* Do not extract dc:format, as we've got better ways to determine mimetype */
00725                         'identifier'        => array(
00726                                 'map_group' => 'deprecated',
00727                                 'map_name'  => 'Identifier',
00728                                 'mode'      => XMPReader::MODE_SIMPLE,
00729                         ),
00730                         'language'          => array(
00731                                 'map_group' => 'general',
00732                                 'map_name'  => 'LanguageCode', /* mapped with iptc 2:135 */
00733                                 'mode'      => XMPReader::MODE_BAG,
00734                                 'validate'  => 'validateLangCode',
00735                         ),
00736                         'publisher'         => array(
00737                                 'map_group' => 'general',
00738                                 'map_name'  => 'dc-publisher',
00739                                 'mode'      => XMPReader::MODE_BAG,
00740                         ),
00741                         // for related images/resources
00742                         'relation'          => array(
00743                                 'map_group' => 'general',
00744                                 'map_name'  => 'dc-relation',
00745                                 'mode'      => XMPReader::MODE_BAG,
00746                         ),
00747                         'rights'            => array(
00748                                 'map_group' => 'general',
00749                                 'map_name'  => 'Copyright',
00750                                 'mode'      => XMPReader::MODE_LANG,
00751                         ),
00752                         // Note: source is not mapped with iptc source, since iptc
00753                         // source describes the source of the image in terms of a person
00754                         // who provided the image, where this is to describe an image that the
00755                         // current one is based on.
00756                         'source'            => array(
00757                                 'map_group' => 'general',
00758                                 'map_name'  => 'dc-source',
00759                                 'mode'      => XMPReader::MODE_SIMPLE,
00760                         ),
00761                         'subject'           => array(
00762                                 'map_group' => 'general',
00763                                 'map_name'  => 'Keywords', /* maps to iptc 2:25 */
00764                                 'mode'      => XMPReader::MODE_BAG,
00765                         ),
00766                         'type'              => array(
00767                                 'map_group' => 'general',
00768                                 'map_name'  => 'dc-type',
00769                                 'mode'      => XMPReader::MODE_BAG,
00770                         ),
00771                 ),
00772                 'http://ns.adobe.com/xap/1.0/' => array(
00773                         'CreateDate' => array(
00774                                 'map_group' => 'general',
00775                                 'map_name' => 'DateTimeDigitized',
00776                                 'mode'     => XMPReader::MODE_SIMPLE,
00777                                 'validate' => 'validateDate',
00778                         ),
00779                         'CreatorTool' => array(
00780                                 'map_group' => 'general',
00781                                 'map_name'  => 'Software',
00782                                 'mode'      => XMPReader::MODE_SIMPLE
00783                         ),
00784                         'Identifier' => array(
00785                                 'map_group' => 'general',
00786                                 'mode'      => XMPReader::MODE_BAG,
00787                         ),
00788                         'Label' => array(
00789                                 'map_group' => 'general',
00790                                 'mode'      => XMPReader::MODE_SIMPLE,
00791                         ),
00792                         'ModifyDate' => array(
00793                                 'map_group' => 'general',
00794                                 'mode'      => XMPReader::MODE_SIMPLE,
00795                                 'map_name'  => 'DateTime',
00796                                 'validate'  => 'validateDate',
00797                         ),
00798                         'MetadataDate' => array(
00799                                 'map_group' => 'general',
00800                                 'mode'      => XMPReader::MODE_SIMPLE,
00801                                 // map_name to be consistent with other date names.
00802                                 'map_name'  => 'DateTimeMetadata',
00803                                 'validate'  => 'validateDate',
00804                         ),
00805                         'Nickname' => array(
00806                                 'map_group' => 'general',
00807                                 'mode'      => XMPReader::MODE_SIMPLE,
00808                         ),
00809                         'Rating' => array(
00810                                 'map_group' => 'general',
00811                                 'mode'      => XMPReader::MODE_SIMPLE,
00812                                 'validate'  => 'validateRating',
00813                         ),
00814                 ),
00815                 'http://ns.adobe.com/xap/1.0/rights/' => array(
00816                         'Certificate' => array(
00817                                 'map_group' => 'general',
00818                                 'map_name'  => 'RightsCertificate',
00819                                 'mode'      => XMPReader::MODE_SIMPLE,
00820                         ),
00821                         'Marked' => array(
00822                                 'map_group' => 'general',
00823                                 'map_name'  => 'Copyrighted',
00824                                 'mode'      => XMPReader::MODE_SIMPLE,
00825                                 'validate'  => 'validateBoolean',
00826                         ),
00827                         'Owner' => array(
00828                                 'map_group' => 'general',
00829                                 'map_name'  => 'CopyrightOwner',
00830                                 'mode'      => XMPReader::MODE_BAG,
00831                         ),
00832                         // this seems similar to dc:rights.
00833                         'UsageTerms' => array(
00834                                 'map_group' => 'general',
00835                                 'mode' => XMPReader::MODE_LANG,
00836                         ),
00837                         'WebStatement' => array(
00838                                 'map_group' => 'general',
00839                                 'mode' => XMPReader::MODE_SIMPLE,
00840                         ),
00841                 ),
00842                 // XMP media management.
00843                 'http://ns.adobe.com/xap/1.0/mm/' => array(
00844                         // if we extract the exif UniqueImageID, might
00845                         // as well do this too.
00846                         'OriginalDocumentID' => array(
00847                                 'map_group' => 'general',
00848                                 'mode'      => XMPReader::MODE_SIMPLE,
00849                         ),
00850                         // It might also be useful to do xmpMM:LastURL
00851                         // and xmpMM:DerivedFrom as you can potentially,
00852                         // get the url of this document/source for this
00853                         // document. However whats more likely is you'd
00854                         // get a file:// url for the path of the doc,
00855                         // which is somewhat of a privacy issue.
00856                 ),
00857                 'http://creativecommons.org/ns#' => array(
00858                         'license' => array(
00859                                 'map_name'  => 'LicenseUrl',
00860                                 'map_group' => 'general',
00861                                 'mode'      => XMPReader::MODE_SIMPLE,
00862                         ),
00863                         'morePermissions' => array(
00864                                 'map_name'  => 'MorePermissionsUrl',
00865                                 'map_group' => 'general',
00866                                 'mode'      => XMPReader::MODE_SIMPLE,
00867                         ),
00868                         'attributionURL' => array(
00869                                 'map_group' => 'general',
00870                                 'map_name'  => 'AttributionUrl',
00871                                 'mode'      => XMPReader::MODE_SIMPLE,
00872                         ),
00873                         'attributionName' => array(
00874                                 'map_group' => 'general',
00875                                 'map_name'  => 'PreferredAttributionName',
00876                                 'mode'      => XMPReader::MODE_SIMPLE,
00877                         ),
00878                 ),
00879                 //Note, this property affects how jpeg metadata is extracted.
00880                 'http://ns.adobe.com/xmp/note/' => array(
00881                         'HasExtendedXMP' => array(
00882                                 'map_group' => 'special',
00883                                 'mode'      => XMPReader::MODE_SIMPLE,
00884                         ),
00885                 ),
00886                 /* Note, in iptc schemas, the legacy properties are denoted
00887                  * as deprecated, since other properties should used instead,
00888                  * and properties marked as deprecated in the standard are
00889                  * are marked as general here as they don't have replacements
00890                  */
00891                 'http://ns.adobe.com/photoshop/1.0/' => array(
00892                         'City' => array(
00893                                 'map_group' => 'deprecated',
00894                                 'mode'      => XMPReader::MODE_SIMPLE,
00895                                 'map_name'  => 'CityDest',
00896                         ),
00897                         'Country' => array(
00898                                 'map_group' => 'deprecated',
00899                                 'mode'      => XMPReader::MODE_SIMPLE,
00900                                 'map_name'  => 'CountryDest',
00901                         ),
00902                         'State' => array(
00903                                 'map_group' => 'deprecated',
00904                                 'mode'      => XMPReader::MODE_SIMPLE,
00905                                 'map_name'  => 'ProvinceOrStateDest',
00906                         ),
00907                         'DateCreated' => array(
00908                                 'map_group' => 'deprecated',
00909                                 // marking as deprecated as the xmp prop preferred
00910                                 'mode'      => XMPReader::MODE_SIMPLE,
00911                                 'map_name'  => 'DateTimeOriginal',
00912                                 'validate'  => 'validateDate',
00913                                 // note this prop is an XMP, not IPTC date
00914                         ),
00915                         'CaptionWriter' => array(
00916                                 'map_group' => 'general',
00917                                 'mode'      => XMPReader::MODE_SIMPLE,
00918                                 'map_name'  => 'Writer',
00919                         ),
00920                         'Instructions' => array(
00921                                 'map_group' => 'general',
00922                                 'mode'      => XMPReader::MODE_SIMPLE,
00923                                 'map_name'  => 'SpecialInstructions',
00924                         ),
00925                         'TransmissionReference' => array(
00926                                 'map_group' => 'general',
00927                                 'mode'      => XMPReader::MODE_SIMPLE,
00928                                 'map_name'  => 'OriginalTransmissionRef',
00929                         ),
00930                         'AuthorsPosition' => array(
00931                                 /* This corresponds with 2:85
00932                                  * By-line Title, which needs to be
00933                                  * handled weirdly to correspond
00934                                  * with iptc/exif. */
00935                                 'map_group' => 'special',
00936                                 'mode'      => XMPReader::MODE_SIMPLE
00937                         ),
00938                         'Credit' => array(
00939                                 'map_group' => 'general',
00940                                 'mode'      => XMPReader::MODE_SIMPLE,
00941                         ),
00942                         'Source' => array(
00943                                 'map_group' => 'general',
00944                                 'mode'      => XMPReader::MODE_SIMPLE,
00945                         ),
00946                         'Urgency' => array(
00947                                 'map_group' => 'general',
00948                                 'mode'      => XMPReader::MODE_SIMPLE,
00949                         ),
00950                         'Category' => array(
00951                                 // Note, this prop is deprecated, but in general
00952                                 // group since it doesn't have a replacement.
00953                                 'map_group' => 'general',
00954                                 'mode'      => XMPReader::MODE_SIMPLE,
00955                                 'map_name'  => 'iimCategory',
00956                         ),
00957                         'SupplementalCategories' => array(
00958                                 'map_group' => 'general',
00959                                 'mode'      => XMPReader::MODE_BAG,
00960                                 'map_name'  => 'iimSupplementalCategory',
00961                         ),
00962                         'Headline' => array(
00963                                 'map_group' => 'general',
00964                                 'mode'      => XMPReader::MODE_SIMPLE
00965                         ),
00966                 ),
00967                 'http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/' => array(
00968                         'CountryCode' => array(
00969                                 'map_group' => 'deprecated',
00970                                 'mode'      => XMPReader::MODE_SIMPLE,
00971                                 'map_name'  => 'CountryCodeDest',
00972                         ),
00973                         'IntellectualGenre' => array(
00974                                 'map_group' => 'general',
00975                                 'mode'      => XMPReader::MODE_SIMPLE,
00976                         ),
00977                         // Note, this is a six digit code.
00978                         // See: http://cv.iptc.org/newscodes/scene/
00979                         // Since these aren't really all that common,
00980                         // we just show the number.
00981                         'Scene' => array(
00982                                 'map_group' => 'general',
00983                                 'mode'      => XMPReader::MODE_BAG,
00984                                 'validate'  => 'validateInteger',
00985                                 'map_name'  => 'SceneCode',
00986                         ),
00987                         /* Note: SubjectCode should be an 8 ascii digits.
00988                          * it is not really an integer (has leading 0's,
00989                          * cannot have a +/- sign), but validateInteger
00990                          * will let it through.
00991                          */
00992                         'SubjectCode' => array(
00993                                 'map_group' => 'general',
00994                                 'mode'      => XMPReader::MODE_BAG,
00995                                 'map_name'  => 'SubjectNewsCode',
00996                                 'validate'  => 'validateInteger'
00997                         ),
00998                         'Location' => array(
00999                                 'map_group' => 'deprecated',
01000                                 'mode'      => XMPReader::MODE_SIMPLE,
01001                                 'map_name'  => 'SublocationDest',
01002                         ),
01003                         'CreatorContactInfo' => array(
01004                                 /* Note this maps to 2:118 in iim
01005                                  * (Contact) field. However those field
01006                                  * types are slightly different - 2:118
01007                                  * is free form text field, where this
01008                                  * is more structured.
01009                                  */
01010                                 'map_group' => 'general',
01011                                 'mode'      => XMPReader::MODE_STRUCT,
01012                                 'map_name'  => 'Contact',
01013                                 'children'  => array(
01014                                         'CiAdrExtadr' => true,
01015                                         'CiAdrCity'   => true,
01016                                         'CiAdrCtry'   => true,
01017                                         'CiEmailWork' => true,
01018                                         'CiTelWork'   => true,
01019                                         'CiAdrPcode'  => true,
01020                                         'CiAdrRegion' => true,
01021                                         'CiUrlWork'   => true,
01022                                 ),
01023                         ),
01024                         'CiAdrExtadr' => array( /* address */
01025                                 'map_group' => 'general',
01026                                 'mode'      => XMPReader::MODE_SIMPLE,
01027                                 'structPart'=> true,
01028                         ),
01029                         'CiAdrCity' => array( /* city */
01030                                 'map_group' => 'general',
01031                                 'mode'      => XMPReader::MODE_SIMPLE,
01032                                 'structPart'=> true,
01033                         ),
01034                         'CiAdrCtry' => array( /* country */
01035                                 'map_group' => 'general',
01036                                 'mode'      => XMPReader::MODE_SIMPLE,
01037                                 'structPart'=> true,
01038                         ),
01039                         'CiEmailWork' => array( /* email (possibly separated by ',') */
01040                                 'map_group' => 'general',
01041                                 'mode'      => XMPReader::MODE_SIMPLE,
01042                                 'structPart'=> true,
01043                         ),
01044                         'CiTelWork' => array( /* telephone */
01045                                 'map_group' => 'general',
01046                                 'mode'      => XMPReader::MODE_SIMPLE,
01047                                 'structPart'=> true,
01048                         ),
01049                         'CiAdrPcode' => array( /* postal code */
01050                                 'map_group' => 'general',
01051                                 'mode'      => XMPReader::MODE_SIMPLE,
01052                                 'structPart'=> true,
01053                         ),
01054                         'CiAdrRegion' => array( /* province/state */
01055                                 'map_group' => 'general',
01056                                 'mode'      => XMPReader::MODE_SIMPLE,
01057                                 'structPart'=> true,
01058                         ),
01059                         'CiUrlWork' => array( /* url. Multiple may be separated by comma. */
01060                                 'map_group' => 'general',
01061                                 'mode'      => XMPReader::MODE_SIMPLE,
01062                                 'structPart'=> true,
01063                         ),
01064                         /* End contact info struct properties */
01065                 ),
01066                 'http://iptc.org/std/Iptc4xmpExt/2008-02-29/' => array(
01067                         'Event' => array(
01068                                 'map_group' => 'general',
01069                                 'mode'      => XMPReader::MODE_SIMPLE,
01070                         ),
01071                         'OrganisationInImageName' => array(
01072                                 'map_group' => 'general',
01073                                 'mode'      => XMPReader::MODE_BAG,
01074                                 'map_name'  => 'OrganisationInImage'
01075                         ),
01076                         'PersonInImage' => array(
01077                                 'map_group' => 'general',
01078                                 'mode'      => XMPReader::MODE_BAG,
01079                         ),
01080                         'MaxAvailHeight' => array(
01081                                 'map_group' => 'general',
01082                                 'mode'      => XMPReader::MODE_SIMPLE,
01083                                 'validate'  => 'validateInteger',
01084                                 'map_name'  => 'OriginalImageHeight',
01085                         ),
01086                         'MaxAvailWidth' => array(
01087                                 'map_group' => 'general',
01088                                 'mode'      => XMPReader::MODE_SIMPLE,
01089                                 'validate'  => 'validateInteger',
01090                                 'map_name'  => 'OriginalImageWidth',
01091                         ),
01092                         // LocationShown and LocationCreated are handled
01093                         // specially because they are hierarchical, but we
01094                         // also want to merge with the old non-hierarchical.
01095                         'LocationShown' => array(
01096                                 'map_group' => 'special',
01097                                 'mode'      => XMPReader::MODE_BAGSTRUCT,
01098                                 'children'  => array(
01099                                         'WorldRegion' => true,
01100                                         'CountryCode' => true, /* iso code */
01101                                         'CountryName' => true,
01102                                         'ProvinceState' => true,
01103                                         'City' => true,
01104                                         'Sublocation' => true,
01105                                 ),
01106                         ),
01107                         'LocationCreated' => array(
01108                                 'map_group' => 'special',
01109                                 'mode'      => XMPReader::MODE_BAGSTRUCT,
01110                                 'children'  => array(
01111                                         'WorldRegion' => true,
01112                                         'CountryCode' => true, /* iso code */
01113                                         'CountryName' => true,
01114                                         'ProvinceState' => true,
01115                                         'City' => true,
01116                                         'Sublocation' => true,
01117                                 ),
01118                         ),
01119                         'WorldRegion' => array(
01120                                 'map_group' => 'special',
01121                                 'mode'      => XMPReader::MODE_SIMPLE,
01122                                 'structPart'=> true,
01123                         ),
01124                         'CountryCode' => array(
01125                                 'map_group' => 'special',
01126                                 'mode'      => XMPReader::MODE_SIMPLE,
01127                                 'structPart'=> true,
01128                         ),
01129                         'CountryName' => array(
01130                                 'map_group' => 'special',
01131                                 'mode'      => XMPReader::MODE_SIMPLE,
01132                                 'structPart'=> true,
01133                                 'map_name'  => 'Country',
01134                         ),
01135                         'ProvinceState' => array(
01136                                 'map_group' => 'special',
01137                                 'mode'      => XMPReader::MODE_SIMPLE,
01138                                 'structPart'=> true,
01139                                 'map_name'  => 'ProvinceOrState',
01140                         ),
01141                         'City' => array(
01142                                 'map_group' => 'special',
01143                                 'mode'      => XMPReader::MODE_SIMPLE,
01144                                 'structPart'=> true,
01145                         ),
01146                         'Sublocation' => array(
01147                                 'map_group' => 'special',
01148                                 'mode'      => XMPReader::MODE_SIMPLE,
01149                                 'structPart'=> true,
01150                         ),
01151 
01152                         /* Other props that might be interesting but
01153                          * Not currently extracted:
01154                          * ArtworkOrObject, (info about objects in picture)
01155                          * DigitalSourceType
01156                          * RegistryId
01157                          */
01158                 ),
01159 
01160                 /* Plus props we might want to consider:
01161                  * (Note: some of these have unclear/incomplete definitions
01162                  * from the iptc4xmp standard).
01163                  * ImageSupplier (kind of like iptc source field)
01164                  * ImageSupplierId (id code for image from supplier)
01165                  * CopyrightOwner
01166                  * ImageCreator
01167                  * Licensor
01168                  * Various model release fields
01169                  * Property release fields.
01170                  */
01171         );
01172 }