| Home >> All >> com >> drew >> metadata >> [ exif Javadoc ] |
Source code: com/drew/metadata/exif/CanonMakernoteDescriptor.java
1 /* 2 * Created by dnoakes on 27-Nov-2002 10:12:05 using IntelliJ IDEA. 3 */ 4 package com.drew.metadata.exif; 5 6 import com.drew.metadata.Directory; 7 import com.drew.metadata.MetadataException; 8 import com.drew.metadata.TagDescriptor; 9 10 /** 11 * 12 */ 13 public class CanonMakernoteDescriptor extends TagDescriptor 14 { 15 public CanonMakernoteDescriptor(Directory directory) 16 { 17 super(directory); 18 } 19 20 public String getDescription(int tagType) throws MetadataException 21 { 22 switch (tagType) { 23 case CanonMakernoteDirectory.TAG_CANON_STATE1_MACRO_MODE: 24 return getMacroModeDescription(); 25 case CanonMakernoteDirectory.TAG_CANON_STATE1_SELF_TIMER_DELAY: 26 return getSelfTimerDelayDescription(); 27 case CanonMakernoteDirectory.TAG_CANON_STATE1_FLASH_MODE: 28 return getFlashModeDescription(); 29 case CanonMakernoteDirectory.TAG_CANON_STATE1_CONTINUOUS_DRIVE_MODE: 30 return getContinuousDriveModeDescription(); 31 case CanonMakernoteDirectory.TAG_CANON_STATE1_FOCUS_MODE_1: 32 return getFocusMode1Description(); 33 case CanonMakernoteDirectory.TAG_CANON_STATE1_IMAGE_SIZE: 34 return getImageSizeDescription(); 35 case CanonMakernoteDirectory.TAG_CANON_STATE1_EASY_SHOOTING_MODE: 36 return getEasyShootingModeDescription(); 37 case CanonMakernoteDirectory.TAG_CANON_STATE1_CONTRAST: 38 return getContrastDescription(); 39 case CanonMakernoteDirectory.TAG_CANON_STATE1_SATURATION: 40 return getSaturationDescription(); 41 case CanonMakernoteDirectory.TAG_CANON_STATE1_SHARPNESS: 42 return getSharpnessDescription(); 43 case CanonMakernoteDirectory.TAG_CANON_STATE1_ISO: 44 return getIsoDescription(); 45 case CanonMakernoteDirectory.TAG_CANON_STATE1_METERING_MODE: 46 return getMeteringModeDescription(); 47 case CanonMakernoteDirectory.TAG_CANON_STATE1_AF_POINT_SELECTED: 48 return getAfPointSelectedDescription(); 49 case CanonMakernoteDirectory.TAG_CANON_STATE1_EXPOSURE_MODE: 50 return getExposureModeDescription(); 51 case CanonMakernoteDirectory.TAG_CANON_STATE1_LONG_FOCAL_LENGTH: 52 return getLongFocalLengthDescription(); 53 case CanonMakernoteDirectory.TAG_CANON_STATE1_SHORT_FOCAL_LENGTH: 54 return getShortFocalLengthDescription(); 55 case CanonMakernoteDirectory.TAG_CANON_STATE1_FOCAL_UNITS_PER_MM: 56 return getFocalUnitsPerMillimetreDescription(); 57 case CanonMakernoteDirectory.TAG_CANON_STATE1_FLASH_DETAILS: 58 return getFlashDetailsDescription(); 59 case CanonMakernoteDirectory.TAG_CANON_STATE1_FOCUS_MODE_2: 60 return getFocusMode2Description(); 61 case CanonMakernoteDirectory.TAG_CANON_STATE2_WHITE_BALANCE: 62 return getWhiteBalanceDescription(); 63 case CanonMakernoteDirectory.TAG_CANON_STATE2_AF_POINT_USED: 64 return getAfPointUsedDescription(); 65 case CanonMakernoteDirectory.TAG_CANON_STATE2_FLASH_BIAS: 66 return getFlashBiasDescription(); 67 default: 68 return _directory.getString(tagType); 69 } 70 } 71 72 private String getFlashBiasDescription() throws MetadataException 73 { 74 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE2_FLASH_BIAS)) return null; 75 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE2_FLASH_BIAS); 76 switch (value) { 77 case 0xffc0: 78 return "-2 EV"; 79 case 0xffcc: 80 return "-1.67 EV"; 81 case 0xffd0: 82 return "-1.50 EV"; 83 case 0xffd4: 84 return "-1.33 EV"; 85 case 0xffe0: 86 return "-1 EV"; 87 case 0xffec: 88 return "-0.67 EV"; 89 case 0xfff0: 90 return "-0.50 EV"; 91 case 0xfff4: 92 return "-0.33 EV"; 93 case 0x0000: 94 return "0 EV"; 95 case 0x000c: 96 return "0.33 EV"; 97 case 0x0010: 98 return "0.50 EV"; 99 case 0x0014: 100 return "0.67 EV"; 101 case 0x0020: 102 return "1 EV"; 103 case 0x002c: 104 return "1.33 EV"; 105 case 0x0030: 106 return "1.50 EV"; 107 case 0x0034: 108 return "1.67 EV"; 109 case 0x0040: 110 return "2 EV"; 111 default: 112 return "Unknown (" + value + ")"; 113 } 114 } 115 116 private String getAfPointUsedDescription() throws MetadataException 117 { 118 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE2_AF_POINT_USED)) return null; 119 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE2_AF_POINT_USED); 120 if ((value & 0x7) == 0) { 121 return "Right"; 122 } else if ((value & 0x7) == 1) { 123 return "Centre"; 124 } else if ((value & 0x7) == 2) { 125 return "Left"; 126 } else { 127 return "Unknown (" + value + ")"; 128 } 129 } 130 131 private String getWhiteBalanceDescription() throws MetadataException 132 { 133 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE2_WHITE_BALANCE)) return null; 134 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE2_WHITE_BALANCE); 135 switch (value) { 136 case 0: 137 return "Auto"; 138 case 1: 139 return "Sunny"; 140 case 2: 141 return "Cloudy"; 142 case 3: 143 return "Tungsten"; 144 case 4: 145 return "Flourescent"; 146 case 5: 147 return "Flash"; 148 case 6: 149 return "Custom"; 150 default: 151 return "Unknown (" + value + ")"; 152 } 153 } 154 155 private String getFocusMode2Description() throws MetadataException 156 { 157 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_FOCUS_MODE_2)) return null; 158 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_FOCUS_MODE_2); 159 switch (value) { 160 case 0: 161 return "Single"; 162 case 1: 163 return "Continuous"; 164 default: 165 return "Unknown (" + value + ")"; 166 } 167 } 168 169 private String getFlashDetailsDescription() throws MetadataException 170 { 171 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_FLASH_DETAILS)) return null; 172 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_FLASH_DETAILS); 173 if (((value << 14) & 1) > 0) { 174 return "External E-TTL"; 175 } 176 if (((value << 13) & 1) > 0) { 177 return "Internal flash"; 178 } 179 if (((value << 11) & 1) > 0) { 180 return "FP sync used"; 181 } 182 if (((value << 4) & 1) > 0) { 183 return "FP sync enabled"; 184 } 185 return "Unknown (" + value + ")"; 186 } 187 188 private String getFocalUnitsPerMillimetreDescription() throws MetadataException 189 { 190 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_FOCAL_UNITS_PER_MM)) return ""; 191 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_FOCAL_UNITS_PER_MM); 192 if (value != 0) { 193 return Integer.toString(value); 194 } else { 195 return ""; 196 } 197 } 198 199 private String getShortFocalLengthDescription() throws MetadataException 200 { 201 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_SHORT_FOCAL_LENGTH)) return null; 202 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_SHORT_FOCAL_LENGTH); 203 String units = getFocalUnitsPerMillimetreDescription(); 204 return Integer.toString(value) + " " + units; 205 } 206 207 private String getLongFocalLengthDescription() throws MetadataException 208 { 209 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_LONG_FOCAL_LENGTH)) return null; 210 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_LONG_FOCAL_LENGTH); 211 String units = getFocalUnitsPerMillimetreDescription(); 212 return Integer.toString(value) + " " + units; 213 } 214 215 private String getExposureModeDescription() throws MetadataException 216 { 217 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_EXPOSURE_MODE)) return null; 218 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_EXPOSURE_MODE); 219 switch (value) { 220 case 0: 221 return "Easy shooting"; 222 case 1: 223 return "Program"; 224 case 2: 225 return "Tv-priority"; 226 case 3: 227 return "Av-priority"; 228 case 4: 229 return "Manual"; 230 case 5: 231 return "A-DEP"; 232 default: 233 return "Unknown (" + value + ")"; 234 } 235 } 236 237 private String getAfPointSelectedDescription() throws MetadataException 238 { 239 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_AF_POINT_SELECTED)) return null; 240 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_AF_POINT_SELECTED); 241 switch (value) { 242 case 0x3000: 243 return "None (MF)"; 244 case 0x3001: 245 return "Auto selected"; 246 case 0x3002: 247 return "Right"; 248 case 0x3003: 249 return "Centre"; 250 case 0x3004: 251 return "Left"; 252 default: 253 return "Unknown (" + value + ")"; 254 } 255 } 256 257 private String getMeteringModeDescription() throws MetadataException 258 { 259 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_METERING_MODE)) return null; 260 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_METERING_MODE); 261 switch (value) { 262 case 3: 263 return "Evaluative"; 264 case 4: 265 return "Partial"; 266 case 5: 267 return "Centre weighted"; 268 default: 269 return "Unknown (" + value + ")"; 270 } 271 } 272 273 private String getIsoDescription() throws MetadataException 274 { 275 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_ISO)) return null; 276 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_ISO); 277 switch (value) { 278 case 0: 279 return "Not specified (see ISOSpeedRatings tag)"; 280 case 15: 281 return "Auto"; 282 case 16: 283 return "50"; 284 case 17: 285 return "100"; 286 case 18: 287 return "200"; 288 case 19: 289 return "400"; 290 default: 291 return "Unknown (" + value + ")"; 292 } 293 } 294 295 private String getSharpnessDescription() throws MetadataException 296 { 297 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_SHARPNESS)) return null; 298 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_SHARPNESS); 299 switch (value) { 300 case 0xFFFF: 301 return "Low"; 302 case 0x000: 303 return "Normal"; 304 case 0x001: 305 return "High"; 306 default: 307 return "Unknown (" + value + ")"; 308 } 309 } 310 311 private String getSaturationDescription() throws MetadataException 312 { 313 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_SATURATION)) return null; 314 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_SATURATION); 315 switch (value) { 316 case 0xFFFF: 317 return "Low"; 318 case 0x000: 319 return "Normal"; 320 case 0x001: 321 return "High"; 322 default: 323 return "Unknown (" + value + ")"; 324 } 325 } 326 327 private String getContrastDescription() throws MetadataException 328 { 329 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_CONTRAST)) return null; 330 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_CONTRAST); 331 switch (value) { 332 case 0xFFFF: 333 return "Low"; 334 case 0x000: 335 return "Normal"; 336 case 0x001: 337 return "High"; 338 default: 339 return "Unknown (" + value + ")"; 340 } 341 } 342 343 private String getEasyShootingModeDescription() throws MetadataException 344 { 345 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_EASY_SHOOTING_MODE)) return null; 346 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_EASY_SHOOTING_MODE); 347 switch (value) { 348 case 0: 349 return "Full auto"; 350 case 1: 351 return "Manual"; 352 case 2: 353 return "Landscape"; 354 case 3: 355 return "Fast shutter"; 356 case 4: 357 return "Slow shutter"; 358 case 5: 359 return "Night"; 360 case 6: 361 return "B&W"; 362 case 7: 363 return "Sepia"; 364 case 8: 365 return "Portrait"; 366 case 9: 367 return "Sports"; 368 case 10: 369 return "Macro / Closeup"; 370 case 11: 371 return "Pan focus"; 372 default: 373 return "Unknown (" + value + ")"; 374 } 375 } 376 377 private String getImageSizeDescription() throws MetadataException 378 { 379 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_IMAGE_SIZE)) return null; 380 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_IMAGE_SIZE); 381 switch (value) { 382 case 0: 383 return "Large"; 384 case 1: 385 return "Medium"; 386 case 2: 387 return "Small"; 388 default: 389 return "Unknown (" + value + ")"; 390 } 391 } 392 393 private String getFocusMode1Description() throws MetadataException 394 { 395 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_FOCUS_MODE_1)) return null; 396 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_FOCUS_MODE_1); 397 switch (value) { 398 case 0: 399 return "One-shot"; 400 case 1: 401 return "AI Servo"; 402 case 2: 403 return "AI Focus"; 404 case 3: 405 return "MF"; 406 case 4: 407 // TODO should check field 32 here (FOCUS_MODE_2) 408 return "Single"; 409 case 5: 410 return "Continuous"; 411 case 6: 412 return "MF"; 413 default: 414 return "Unknown (" + value + ")"; 415 } 416 } 417 418 private String getContinuousDriveModeDescription() throws MetadataException 419 { 420 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_CONTINUOUS_DRIVE_MODE)) return null; 421 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_CONTINUOUS_DRIVE_MODE); 422 switch (value) { 423 case 0: 424 if (_directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_SELF_TIMER_DELAY) == 0) { 425 return "Single shot"; 426 } else { 427 return "Single shot with self-timer"; 428 } 429 case 1: 430 return "Continuous"; 431 default: 432 return "Unknown (" + value + ")"; 433 } 434 } 435 436 private String getFlashModeDescription() throws MetadataException 437 { 438 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_FLASH_MODE)) return null; 439 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_FLASH_MODE); 440 switch (value) { 441 case 0: 442 return "No flash fired"; 443 case 1: 444 return "Auto"; 445 case 2: 446 return "On"; 447 case 3: 448 return "Red-eye reduction"; 449 case 4: 450 return "Slow-synchro"; 451 case 5: 452 return "Auto and red-eye reduction"; 453 case 6: 454 return "On and red-eye reduction"; 455 case 16: 456 // note: this value not set on Canon D30 457 return "Extenal flash"; 458 default: 459 return "Unknown (" + value + ")"; 460 } 461 } 462 463 private String getSelfTimerDelayDescription() throws MetadataException 464 { 465 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_SELF_TIMER_DELAY)) return null; 466 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_SELF_TIMER_DELAY); 467 if (value == 0) { 468 return "Self timer not used"; 469 } else { 470 // TODO find an image that tests this calculation 471 return Double.toString((double)value * 0.1d) + " sec"; 472 } 473 } 474 475 private String getMacroModeDescription() throws MetadataException 476 { 477 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_MACRO_MODE)) return null; 478 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_MACRO_MODE); 479 switch (value) { 480 case 1: 481 return "Macro"; 482 case 2: 483 return "Normal"; 484 default: 485 return "Unknown (" + value + ")"; 486 } 487 } 488 }