Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

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 }