source: josm/trunk/src/com/drew/metadata/exif/CanonMakernoteDescriptor.java@ 4231

Last change on this file since 4231 was 4231, checked in by stoecker, 13 years ago

add signpost and metadata extractor code to repository directly

File size: 29.6 KB
Line 
1/*
2 * This is public domain software - that is, you can do whatever you want
3 * with it, and include it software that is licensed under the GNU or the
4 * BSD license, or whatever other licence you choose, including proprietary
5 * closed source licenses. I do ask that you leave this header in tact.
6 *
7 * If you make modifications to this code that you think would benefit the
8 * wider community, please send me a copy and I'll post it on my site.
9 *
10 * If you make use of this code, I'd appreciate hearing about it.
11 * drew@drewnoakes.com
12 * Latest version of this software kept at
13 * http://drewnoakes.com/
14 *
15 * Created by dnoakes on 27-Nov-2002 10:12:05 using IntelliJ IDEA.
16 */
17package com.drew.metadata.exif;
18
19import com.drew.metadata.Directory;
20import com.drew.metadata.MetadataException;
21import com.drew.metadata.TagDescriptor;
22
23/**
24 *
25 */
26public class CanonMakernoteDescriptor extends TagDescriptor
27{
28 public CanonMakernoteDescriptor(Directory directory)
29 {
30 super(directory);
31 }
32
33 public String getDescription(int tagType) throws MetadataException
34 {
35 switch (tagType) {
36 case CanonMakernoteDirectory.TAG_CANON_STATE1_FLASH_ACTIVITY:
37 return getFlashActivityDescription();
38 case CanonMakernoteDirectory.TAG_CANON_STATE1_FOCUS_TYPE:
39 return getFocusTypeDescription();
40 case CanonMakernoteDirectory.TAG_CANON_STATE1_DIGITAL_ZOOM:
41 return getDigitalZoomDescription();
42 case CanonMakernoteDirectory.TAG_CANON_STATE1_QUALITY:
43 return getQualityDescription();
44 case CanonMakernoteDirectory.TAG_CANON_STATE1_MACRO_MODE:
45 return getMacroModeDescription();
46 case CanonMakernoteDirectory.TAG_CANON_STATE1_SELF_TIMER_DELAY:
47 return getSelfTimerDelayDescription();
48 case CanonMakernoteDirectory.TAG_CANON_STATE1_FLASH_MODE:
49 return getFlashModeDescription();
50 case CanonMakernoteDirectory.TAG_CANON_STATE1_CONTINUOUS_DRIVE_MODE:
51 return getContinuousDriveModeDescription();
52 case CanonMakernoteDirectory.TAG_CANON_STATE1_FOCUS_MODE_1:
53 return getFocusMode1Description();
54 case CanonMakernoteDirectory.TAG_CANON_STATE1_IMAGE_SIZE:
55 return getImageSizeDescription();
56 case CanonMakernoteDirectory.TAG_CANON_STATE1_EASY_SHOOTING_MODE:
57 return getEasyShootingModeDescription();
58 case CanonMakernoteDirectory.TAG_CANON_STATE1_CONTRAST:
59 return getContrastDescription();
60 case CanonMakernoteDirectory.TAG_CANON_STATE1_SATURATION:
61 return getSaturationDescription();
62 case CanonMakernoteDirectory.TAG_CANON_STATE1_SHARPNESS:
63 return getSharpnessDescription();
64 case CanonMakernoteDirectory.TAG_CANON_STATE1_ISO:
65 return getIsoDescription();
66 case CanonMakernoteDirectory.TAG_CANON_STATE1_METERING_MODE:
67 return getMeteringModeDescription();
68 case CanonMakernoteDirectory.TAG_CANON_STATE1_AF_POINT_SELECTED:
69 return getAfPointSelectedDescription();
70 case CanonMakernoteDirectory.TAG_CANON_STATE1_EXPOSURE_MODE:
71 return getExposureModeDescription();
72 case CanonMakernoteDirectory.TAG_CANON_STATE1_LONG_FOCAL_LENGTH:
73 return getLongFocalLengthDescription();
74 case CanonMakernoteDirectory.TAG_CANON_STATE1_SHORT_FOCAL_LENGTH:
75 return getShortFocalLengthDescription();
76 case CanonMakernoteDirectory.TAG_CANON_STATE1_FOCAL_UNITS_PER_MM:
77 return getFocalUnitsPerMillimetreDescription();
78 case CanonMakernoteDirectory.TAG_CANON_STATE1_FLASH_DETAILS:
79 return getFlashDetailsDescription();
80 case CanonMakernoteDirectory.TAG_CANON_STATE1_FOCUS_MODE_2:
81 return getFocusMode2Description();
82 case CanonMakernoteDirectory.TAG_CANON_STATE2_WHITE_BALANCE:
83 return getWhiteBalanceDescription();
84 case CanonMakernoteDirectory.TAG_CANON_STATE2_AF_POINT_USED:
85 return getAfPointUsedDescription();
86 case CanonMakernoteDirectory.TAG_CANON_STATE2_FLASH_BIAS:
87 return getFlashBiasDescription();
88 case CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_LONG_EXPOSURE_NOISE_REDUCTION:
89 return getLongExposureNoiseReductionDescription();
90 case CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_SHUTTER_AUTO_EXPOSURE_LOCK_BUTTONS:
91 return getShutterAutoExposureLockButtonDescription();
92 case CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_MIRROR_LOCKUP:
93 return getMirrorLockupDescription();
94 case CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_TV_AV_AND_EXPOSURE_LEVEL:
95 return getTvAndAvExposureLevelDescription();
96 case CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_AF_ASSIST_LIGHT:
97 return getAutoFocusAssistLightDescription();
98 case CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_SHUTTER_SPEED_IN_AV_MODE:
99 return getShutterSpeedInAvModeDescription();
100 case CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_BRACKETTING:
101 return getAutoExposureBrackettingSequenceAndAutoCancellationDescription();
102 case CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_SHUTTER_CURTAIN_SYNC:
103 return getShutterCurtainSyncDescription();
104 case CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_AF_STOP:
105 return getLensAutoFocusStopButtonDescription();
106 case CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_FILL_FLASH_REDUCTION:
107 return getFillFlashReductionDescription();
108 case CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_MENU_BUTTON_RETURN:
109 return getMenuButtonReturnPositionDescription();
110 case CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_SET_BUTTON_FUNCTION:
111 return getSetButtonFunctionWhenShootingDescription();
112 case CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_SENSOR_CLEANING:
113 return getSensorCleaningDescription();
114 default:
115 return _directory.getString(tagType);
116 }
117 }
118
119 public String getLongExposureNoiseReductionDescription() throws MetadataException
120 {
121 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_LONG_EXPOSURE_NOISE_REDUCTION)) return null;
122 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_LONG_EXPOSURE_NOISE_REDUCTION);
123 switch (value) {
124 case 0: return "Off";
125 case 1: return "On";
126 default: return "Unknown (" + value + ")";
127 }
128 }
129 public String getShutterAutoExposureLockButtonDescription() throws MetadataException
130 {
131 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_SHUTTER_AUTO_EXPOSURE_LOCK_BUTTONS)) return null;
132 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_SHUTTER_AUTO_EXPOSURE_LOCK_BUTTONS);
133 switch (value) {
134 case 0: return "AF/AE lock";
135 case 1: return "AE lock/AF";
136 case 2: return "AF/AF lock";
137 case 3: return "AE+release/AE+AF";
138 default: return "Unknown (" + value + ")";
139 }
140 }
141 public String getMirrorLockupDescription() throws MetadataException
142 {
143 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_MIRROR_LOCKUP)) return null;
144 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_MIRROR_LOCKUP);
145 switch (value) {
146 case 0: return "Disabled";
147 case 1: return "Enabled";
148 default: return "Unknown (" + value + ")";
149 }
150 }
151 public String getTvAndAvExposureLevelDescription() throws MetadataException
152 {
153 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_TV_AV_AND_EXPOSURE_LEVEL)) return null;
154 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_TV_AV_AND_EXPOSURE_LEVEL);
155 switch (value) {
156 case 0: return "1/2 stop";
157 case 1: return "1/3 stop";
158 default: return "Unknown (" + value + ")";
159 }
160 }
161 public String getAutoFocusAssistLightDescription() throws MetadataException
162 {
163 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_AF_ASSIST_LIGHT)) return null;
164 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_AF_ASSIST_LIGHT);
165 switch (value) {
166 case 0: return "On (Auto)";
167 case 1: return "Off";
168 default: return "Unknown (" + value + ")";
169 }
170 }
171 public String getShutterSpeedInAvModeDescription() throws MetadataException
172 {
173 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_SHUTTER_SPEED_IN_AV_MODE)) return null;
174 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_SHUTTER_SPEED_IN_AV_MODE);
175 switch (value) {
176 case 0: return "Automatic";
177 case 1: return "1/200 (fixed)";
178 default: return "Unknown (" + value + ")";
179 }
180 }
181 public String getAutoExposureBrackettingSequenceAndAutoCancellationDescription() throws MetadataException
182 {
183 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_BRACKETTING)) return null;
184 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_BRACKETTING);
185 switch (value) {
186 case 0: return "0,-,+ / Enabled";
187 case 1: return "0,-,+ / Disabled";
188 case 2: return "-,0,+ / Enabled";
189 case 3: return "-,0,+ / Disabled";
190 default: return "Unknown (" + value + ")";
191 }
192 }
193 public String getShutterCurtainSyncDescription() throws MetadataException
194 {
195 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_SHUTTER_CURTAIN_SYNC)) return null;
196 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_SHUTTER_CURTAIN_SYNC);
197 switch (value) {
198 case 0: return "1st Curtain Sync";
199 case 1: return "2nd Curtain Sync";
200 default: return "Unknown (" + value + ")";
201 }
202 }
203 public String getLensAutoFocusStopButtonDescription() throws MetadataException
204 {
205 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_AF_STOP)) return null;
206 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_AF_STOP);
207 switch (value) {
208 case 0: return "AF stop";
209 case 1: return "Operate AF";
210 case 2: return "Lock AE and start timer";
211 default: return "Unknown (" + value + ")";
212 }
213 }
214 public String getFillFlashReductionDescription() throws MetadataException
215 {
216 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_FILL_FLASH_REDUCTION)) return null;
217 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_FILL_FLASH_REDUCTION);
218 switch (value) {
219 case 0: return "Enabled";
220 case 1: return "Disabled";
221 default: return "Unknown (" + value + ")";
222 }
223 }
224 public String getMenuButtonReturnPositionDescription() throws MetadataException
225 {
226 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_MENU_BUTTON_RETURN)) return null;
227 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_MENU_BUTTON_RETURN);
228 switch (value) {
229 case 0: return "Top";
230 case 1: return "Previous (volatile)";
231 case 2: return "Previous";
232 default: return "Unknown (" + value + ")";
233 }
234 }
235 public String getSetButtonFunctionWhenShootingDescription() throws MetadataException
236 {
237 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_SET_BUTTON_FUNCTION)) return null;
238 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_SET_BUTTON_FUNCTION);
239 switch (value) {
240 case 0: return "Not Assigned";
241 case 1: return "Change Quality";
242 case 2: return "Change ISO Speed";
243 case 3: return "Select Parameters";
244 default: return "Unknown (" + value + ")";
245 }
246 }
247 public String getSensorCleaningDescription() throws MetadataException
248 {
249 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_SENSOR_CLEANING)) return null;
250 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_CUSTOM_FUNCTION_SENSOR_CLEANING);
251 switch (value) {
252 case 0: return "Disabled";
253 case 1: return "Enabled";
254 default: return "Unknown (" + value + ")";
255 }
256 }
257
258 public String getFlashBiasDescription() throws MetadataException
259 {
260 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE2_FLASH_BIAS)) return null;
261
262 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE2_FLASH_BIAS);
263
264 boolean isNegative = false;
265 if (value > 0xF000)
266 {
267 isNegative = true;
268 value = 0xFFFF - value;
269 value++;
270 }
271
272 // this tag is interesting in that the values returned are:
273 // 0, 0.375, 0.5, 0.626, 1
274 // not
275 // 0, 0.33, 0.5, 0.66, 1
276
277 return ((isNegative) ? "-" : "") + Float.toString(value / 32f) + " EV";
278 }
279
280 public String getAfPointUsedDescription() throws MetadataException
281 {
282 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE2_AF_POINT_USED)) return null;
283 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE2_AF_POINT_USED);
284 if ((value & 0x7) == 0) {
285 return "Right";
286 } else if ((value & 0x7) == 1) {
287 return "Centre";
288 } else if ((value & 0x7) == 2) {
289 return "Left";
290 } else {
291 return "Unknown (" + value + ")";
292 }
293 }
294
295 public String getWhiteBalanceDescription() throws MetadataException
296 {
297 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE2_WHITE_BALANCE)) return null;
298 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE2_WHITE_BALANCE);
299 switch (value) {
300 case 0:
301 return "Auto";
302 case 1:
303 return "Sunny";
304 case 2:
305 return "Cloudy";
306 case 3:
307 return "Tungsten";
308 case 4:
309 return "Flourescent";
310 case 5:
311 return "Flash";
312 case 6:
313 return "Custom";
314 default:
315 return "Unknown (" + value + ")";
316 }
317 }
318
319 public String getFocusMode2Description() throws MetadataException
320 {
321 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_FOCUS_MODE_2)) return null;
322 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_FOCUS_MODE_2);
323 switch (value) {
324 case 0:
325 return "Single";
326 case 1:
327 return "Continuous";
328 default:
329 return "Unknown (" + value + ")";
330 }
331 }
332
333 public String getFlashDetailsDescription() throws MetadataException
334 {
335 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_FLASH_DETAILS)) return null;
336 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_FLASH_DETAILS);
337 if (((value << 14) & 1) > 0) {
338 return "External E-TTL";
339 }
340 if (((value << 13) & 1) > 0) {
341 return "Internal flash";
342 }
343 if (((value << 11) & 1) > 0) {
344 return "FP sync used";
345 }
346 if (((value << 4) & 1) > 0) {
347 return "FP sync enabled";
348 }
349 return "Unknown (" + value + ")";
350 }
351
352 public String getFocalUnitsPerMillimetreDescription() throws MetadataException
353 {
354 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_FOCAL_UNITS_PER_MM)) return "";
355 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_FOCAL_UNITS_PER_MM);
356 if (value != 0) {
357 return Integer.toString(value);
358 } else {
359 return "";
360 }
361 }
362
363 public String getShortFocalLengthDescription() throws MetadataException
364 {
365 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_SHORT_FOCAL_LENGTH)) return null;
366 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_SHORT_FOCAL_LENGTH);
367 String units = getFocalUnitsPerMillimetreDescription();
368 return Integer.toString(value) + " " + units;
369 }
370
371 public String getLongFocalLengthDescription() throws MetadataException
372 {
373 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_LONG_FOCAL_LENGTH)) return null;
374 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_LONG_FOCAL_LENGTH);
375 String units = getFocalUnitsPerMillimetreDescription();
376 return Integer.toString(value) + " " + units;
377 }
378
379 public String getExposureModeDescription() throws MetadataException
380 {
381 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_EXPOSURE_MODE)) return null;
382 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_EXPOSURE_MODE);
383 switch (value) {
384 case 0:
385 return "Easy shooting";
386 case 1:
387 return "Program";
388 case 2:
389 return "Tv-priority";
390 case 3:
391 return "Av-priority";
392 case 4:
393 return "Manual";
394 case 5:
395 return "A-DEP";
396 default:
397 return "Unknown (" + value + ")";
398 }
399 }
400
401 public String getAfPointSelectedDescription() throws MetadataException
402 {
403 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_AF_POINT_SELECTED)) return null;
404 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_AF_POINT_SELECTED);
405 switch (value) {
406 case 0x3000:
407 return "None (MF)";
408 case 0x3001:
409 return "Auto selected";
410 case 0x3002:
411 return "Right";
412 case 0x3003:
413 return "Centre";
414 case 0x3004:
415 return "Left";
416 default:
417 return "Unknown (" + value + ")";
418 }
419 }
420
421 public String getMeteringModeDescription() throws MetadataException
422 {
423 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_METERING_MODE)) return null;
424 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_METERING_MODE);
425 switch (value) {
426 case 3:
427 return "Evaluative";
428 case 4:
429 return "Partial";
430 case 5:
431 return "Centre weighted";
432 default:
433 return "Unknown (" + value + ")";
434 }
435 }
436
437 public String getIsoDescription() throws MetadataException
438 {
439 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_ISO)) return null;
440 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_ISO);
441 switch (value) {
442 case 0:
443 return "Not specified (see ISOSpeedRatings tag)";
444 case 15:
445 return "Auto";
446 case 16:
447 return "50";
448 case 17:
449 return "100";
450 case 18:
451 return "200";
452 case 19:
453 return "400";
454 default:
455 return "Unknown (" + value + ")";
456 }
457 }
458
459 public String getSharpnessDescription() throws MetadataException
460 {
461 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_SHARPNESS)) return null;
462 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_SHARPNESS);
463 switch (value) {
464 case 0xFFFF:
465 return "Low";
466 case 0x000:
467 return "Normal";
468 case 0x001:
469 return "High";
470 default:
471 return "Unknown (" + value + ")";
472 }
473 }
474
475 public String getSaturationDescription() throws MetadataException
476 {
477 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_SATURATION)) return null;
478 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_SATURATION);
479 switch (value) {
480 case 0xFFFF:
481 return "Low";
482 case 0x000:
483 return "Normal";
484 case 0x001:
485 return "High";
486 default:
487 return "Unknown (" + value + ")";
488 }
489 }
490
491 public String getContrastDescription() throws MetadataException
492 {
493 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_CONTRAST)) return null;
494 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_CONTRAST);
495 switch (value) {
496 case 0xFFFF:
497 return "Low";
498 case 0x000:
499 return "Normal";
500 case 0x001:
501 return "High";
502 default:
503 return "Unknown (" + value + ")";
504 }
505 }
506
507 public String getEasyShootingModeDescription() throws MetadataException
508 {
509 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_EASY_SHOOTING_MODE)) return null;
510 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_EASY_SHOOTING_MODE);
511 switch (value) {
512 case 0:
513 return "Full auto";
514 case 1:
515 return "Manual";
516 case 2:
517 return "Landscape";
518 case 3:
519 return "Fast shutter";
520 case 4:
521 return "Slow shutter";
522 case 5:
523 return "Night";
524 case 6:
525 return "B&W";
526 case 7:
527 return "Sepia";
528 case 8:
529 return "Portrait";
530 case 9:
531 return "Sports";
532 case 10:
533 return "Macro / Closeup";
534 case 11:
535 return "Pan focus";
536 default:
537 return "Unknown (" + value + ")";
538 }
539 }
540
541 public String getImageSizeDescription() throws MetadataException
542 {
543 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_IMAGE_SIZE)) return null;
544 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_IMAGE_SIZE);
545 switch (value) {
546 case 0:
547 return "Large";
548 case 1:
549 return "Medium";
550 case 2:
551 return "Small";
552 default:
553 return "Unknown (" + value + ")";
554 }
555 }
556
557 public String getFocusMode1Description() throws MetadataException
558 {
559 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_FOCUS_MODE_1)) return null;
560 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_FOCUS_MODE_1);
561 switch (value) {
562 case 0:
563 return "One-shot";
564 case 1:
565 return "AI Servo";
566 case 2:
567 return "AI Focus";
568 case 3:
569 return "Manual Focus";
570 case 4:
571 // TODO should check field 32 here (FOCUS_MODE_2)
572 return "Single";
573 case 5:
574 return "Continuous";
575 case 6:
576 return "Manual Focus";
577 default:
578 return "Unknown (" + value + ")";
579 }
580 }
581
582 public String getContinuousDriveModeDescription() throws MetadataException
583 {
584 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_CONTINUOUS_DRIVE_MODE)) return null;
585 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_CONTINUOUS_DRIVE_MODE);
586 switch (value) {
587 case 0:
588 if (_directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_SELF_TIMER_DELAY) == 0) {
589 return "Single shot";
590 } else {
591 return "Single shot with self-timer";
592 }
593 case 1:
594 return "Continuous";
595 default:
596 return "Unknown (" + value + ")";
597 }
598 }
599
600 public String getFlashModeDescription() throws MetadataException
601 {
602 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_FLASH_MODE)) return null;
603 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_FLASH_MODE);
604 switch (value) {
605 case 0:
606 return "No flash fired";
607 case 1:
608 return "Auto";
609 case 2:
610 return "On";
611 case 3:
612 return "Red-eye reduction";
613 case 4:
614 return "Slow-synchro";
615 case 5:
616 return "Auto and red-eye reduction";
617 case 6:
618 return "On and red-eye reduction";
619 case 16:
620 // note: this value not set on Canon D30
621 return "Extenal flash";
622 default:
623 return "Unknown (" + value + ")";
624 }
625 }
626
627 public String getSelfTimerDelayDescription() throws MetadataException
628 {
629 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_SELF_TIMER_DELAY)) return null;
630 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_SELF_TIMER_DELAY);
631 if (value == 0) {
632 return "Self timer not used";
633 } else {
634 // TODO find an image that tests this calculation
635 return Double.toString((double)value * 0.1d) + " sec";
636 }
637 }
638
639 public String getMacroModeDescription() throws MetadataException
640 {
641 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_MACRO_MODE)) return null;
642 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_MACRO_MODE);
643 switch (value) {
644 case 1:
645 return "Macro";
646 case 2:
647 return "Normal";
648 default:
649 return "Unknown (" + value + ")";
650 }
651 }
652
653 public String getQualityDescription() throws MetadataException
654 {
655 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_QUALITY)) return null;
656 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_QUALITY);
657 switch (value) {
658 case 2:
659 return "Normal";
660 case 3:
661 return "Fine";
662 case 5:
663 return "Superfine";
664 default:
665 return "Unknown (" + value + ")";
666 }
667 }
668
669 public String getDigitalZoomDescription() throws MetadataException
670 {
671 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_DIGITAL_ZOOM)) return null;
672 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_DIGITAL_ZOOM);
673 switch (value) {
674 case 0:
675 return "No digital zoom";
676 case 1:
677 return "2x";
678 case 2:
679 return "4x";
680 default:
681 return "Unknown (" + value + ")";
682 }
683 }
684
685 public String getFocusTypeDescription() throws MetadataException
686 {
687 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_FOCUS_TYPE)) return null;
688 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_FOCUS_TYPE);
689 switch (value) {
690 case 0:
691 return "Manual";
692 case 1:
693 return "Auto";
694 case 3:
695 return "Close-up (Macro)";
696 case 8:
697 return "Locked (Pan Mode)";
698 default:
699 return "Unknown (" + value + ")";
700 }
701 }
702
703 public String getFlashActivityDescription() throws MetadataException
704 {
705 if (!_directory.containsTag(CanonMakernoteDirectory.TAG_CANON_STATE1_FLASH_ACTIVITY)) return null;
706 int value = _directory.getInt(CanonMakernoteDirectory.TAG_CANON_STATE1_FLASH_ACTIVITY);
707 switch (value) {
708 case 0:
709 return "Flash did not fire";
710 case 1:
711 return "Flash fired";
712 default:
713 return "Unknown (" + value + ")";
714 }
715 }
716}
Note: See TracBrowser for help on using the repository browser.