/* * This is public domain software - that is, you can do whatever you want * with it, and include it software that is licensed under the GNU or the * BSD license, or whatever other licence you choose, including proprietary * closed source licenses. I do ask that you leave this header in tact. * * If you make modifications to this code that you think would benefit the * wider community, please send me a copy and I'll post it on my site. * * If you make use of this code, I'd appreciate hearing about it. * metadata_extractor [at] drewnoakes [dot] com * Latest version of this software kept at * http://drewnoakes.com/ * * Created by dnoakes on 27-Nov-2002 10:10:47 using IntelliJ IDEA. */ package com.drew.metadata.exif; import com.drew.metadata.Directory; import java.util.HashMap; /** * Describes tags specific to Canon cameras. * * Thanks to Bill Richards for his contribution to this makernote directory. * * Many tag definitions explained here: http://www.ozhiker.com/electronics/pjmt/jpeg_info/canon_mn.html */ public class CanonMakernoteDirectory extends Directory { // CANON cameras have some funny bespoke fields that need further processing... public static final int TAG_CANON_CAMERA_STATE_1 = 0x0001; public static final int TAG_CANON_CAMERA_STATE_2 = 0x0004; public static final int TAG_CANON_IMAGE_TYPE = 0x0006; public static final int TAG_CANON_FIRMWARE_VERSION = 0x0007; public static final int TAG_CANON_IMAGE_NUMBER = 0x0008; public static final int TAG_CANON_OWNER_NAME = 0x0009; /** * To display serial number as on camera use: printf( "%04X%05d", highbyte, lowbyte ) * TODO handle this in CanonMakernoteDescriptor */ public static final int TAG_CANON_SERIAL_NUMBER = 0x000C; public static final int TAG_CANON_UNKNOWN_1 = 0x000D; public static final int TAG_CANON_CUSTOM_FUNCTIONS = 0x000F; // These 'sub'-tag values have been created for consistency -- they don't exist within the exif segment /** * 1 = Macro * 2 = Normal */ public static final int TAG_CANON_STATE1_MACRO_MODE = 0xC101; public static final int TAG_CANON_STATE1_SELF_TIMER_DELAY = 0xC102; /** * 2 = Normal * 3 = Fine * 5 = Superfine */ public static final int TAG_CANON_STATE1_QUALITY = 0xC103; /** * 0 = Flash Not Fired * 1 = Auto * 2 = On * 3 = Red Eye Reduction * 4 = Slow Synchro * 5 = Auto + Red Eye Reduction * 6 = On + Red Eye Reduction * 16 = External Flash */ public static final int TAG_CANON_STATE1_FLASH_MODE = 0xC104; /** * 0 = Single Frame or Timer Mode * 1 = Continuous */ public static final int TAG_CANON_STATE1_CONTINUOUS_DRIVE_MODE = 0xC105; public static final int TAG_CANON_STATE1_UNKNOWN_2 = 0xC106; /** * 0 = One-Shot * 1 = AI Servo * 2 = AI Focus * 3 = Manual Focus * 4 = Single * 5 = Continuous * 6 = Manual Focus */ public static final int TAG_CANON_STATE1_FOCUS_MODE_1 = 0xC107; public static final int TAG_CANON_STATE1_UNKNOWN_3 = 0xC108; public static final int TAG_CANON_STATE1_UNKNOWN_4 = 0xC109; /** * 0 = Large * 1 = Medium * 2 = Small */ public static final int TAG_CANON_STATE1_IMAGE_SIZE = 0xC10A; /** * 0 = Full Auto * 1 = Manual * 2 = Landscape * 3 = Fast Shutter * 4 = Slow Shutter * 5 = Night * 6 = Black & White * 7 = Sepia * 8 = Portrait * 9 = Sports * 10 = Macro / Close-Up * 11 = Pan Focus */ public static final int TAG_CANON_STATE1_EASY_SHOOTING_MODE = 0xC10B; /** * 0 = No Digital Zoom * 1 = 2x * 2 = 4x */ public static final int TAG_CANON_STATE1_DIGITAL_ZOOM = 0xC10C; /** * 0 = Normal * 1 = High * 65535 = Low */ public static final int TAG_CANON_STATE1_CONTRAST = 0xC10D; /** * 0 = Normal * 1 = High * 65535 = Low */ public static final int TAG_CANON_STATE1_SATURATION = 0xC10E; /** * 0 = Normal * 1 = High * 65535 = Low */ public static final int TAG_CANON_STATE1_SHARPNESS = 0xC10F; /** * 0 = Check ISOSpeedRatings EXIF tag for ISO Speed * 15 = Auto ISO * 16 = ISO 50 * 17 = ISO 100 * 18 = ISO 200 * 19 = ISO 400 */ public static final int TAG_CANON_STATE1_ISO = 0xC110; /** * 3 = Evaluative * 4 = Partial * 5 = Centre Weighted */ public static final int TAG_CANON_STATE1_METERING_MODE = 0xC111; /** * 0 = Manual * 1 = Auto * 3 = Close-up (Macro) * 8 = Locked (Pan Mode) */ public static final int TAG_CANON_STATE1_FOCUS_TYPE = 0xC112; /** * 12288 = None (Manual Focus) * 12289 = Auto Selected * 12290 = Right * 12291 = Centre * 12292 = Left */ public static final int TAG_CANON_STATE1_AF_POINT_SELECTED = 0xC113; /** * 0 = Easy Shooting (See Easy Shooting Mode) * 1 = Program * 2 = Tv-Priority * 3 = Av-Priority * 4 = Manual * 5 = A-DEP */ public static final int TAG_CANON_STATE1_EXPOSURE_MODE = 0xC114; public static final int TAG_CANON_STATE1_UNKNOWN_7 = 0xC115; public static final int TAG_CANON_STATE1_UNKNOWN_8 = 0xC116; public static final int TAG_CANON_STATE1_LONG_FOCAL_LENGTH = 0xC117; public static final int TAG_CANON_STATE1_SHORT_FOCAL_LENGTH = 0xC118; public static final int TAG_CANON_STATE1_FOCAL_UNITS_PER_MM = 0xC119; public static final int TAG_CANON_STATE1_UNKNOWN_9 = 0xC11A; public static final int TAG_CANON_STATE1_UNKNOWN_10 = 0xC11B; /** * 0 = Flash Did Not Fire * 1 = Flash Fired */ public static final int TAG_CANON_STATE1_FLASH_ACTIVITY = 0xC11C; public static final int TAG_CANON_STATE1_FLASH_DETAILS = 0xC11D; public static final int TAG_CANON_STATE1_UNKNOWN_12 = 0xC11E; public static final int TAG_CANON_STATE1_UNKNOWN_13 = 0xC11F; /** * 0 = Focus Mode: Single * 1 = Focus Mode: Continuous */ public static final int TAG_CANON_STATE1_FOCUS_MODE_2 = 0xC120; /** * 0 = Auto * 1 = Sunny * 2 = Cloudy * 3 = Tungsten * 4 = Flourescent * 5 = Flash * 6 = Custom */ public static final int TAG_CANON_STATE2_WHITE_BALANCE = 0xC207; public static final int TAG_CANON_STATE2_SEQUENCE_NUMBER = 0xC209; public static final int TAG_CANON_STATE2_AF_POINT_USED = 0xC20E; /** * The value of this tag may be translated into a flash bias value, in EV. * * 0xffc0 = -2 EV * 0xffcc = -1.67 EV * 0xffd0 = -1.5 EV * 0xffd4 = -1.33 EV * 0xffe0 = -1 EV * 0xffec = -0.67 EV * 0xfff0 = -0.5 EV * 0xfff4 = -0.33 EV * 0x0000 = 0 EV * 0x000c = 0.33 EV * 0x0010 = 0.5 EV * 0x0014 = 0.67 EV * 0x0020 = 1 EV * 0x002c = 1.33 EV * 0x0030 = 1.5 EV * 0x0034 = 1.67 EV * 0x0040 = 2 EV */ public static final int TAG_CANON_STATE2_FLASH_BIAS = 0xC20F; public static final int TAG_CANON_STATE2_AUTO_EXPOSURE_BRACKETING = 0xC210; public static final int TAG_CANON_STATE2_AEB_BRACKET_VALUE = 0xC211; public static final int TAG_CANON_STATE2_SUBJECT_DISTANCE = 0xC213; /** * Long Exposure Noise Reduction * 0 = Off * 1 = On */ public static final int TAG_CANON_CUSTOM_FUNCTION_LONG_EXPOSURE_NOISE_REDUCTION = 0xC301; /** * Shutter/Auto Exposure-lock buttons * 0 = AF/AE lock * 1 = AE lock/AF * 2 = AF/AF lock * 3 = AE+release/AE+AF */ public static final int TAG_CANON_CUSTOM_FUNCTION_SHUTTER_AUTO_EXPOSURE_LOCK_BUTTONS = 0xC302; /** * Mirror lockup * 0 = Disable * 1 = Enable */ public static final int TAG_CANON_CUSTOM_FUNCTION_MIRROR_LOCKUP = 0xC303; /** * Tv/Av and exposure level * 0 = 1/2 stop * 1 = 1/3 stop */ public static final int TAG_CANON_CUSTOM_FUNCTION_TV_AV_AND_EXPOSURE_LEVEL = 0xC304; /** * AF-assist light * 0 = On (Auto) * 1 = Off */ public static final int TAG_CANON_CUSTOM_FUNCTION_AF_ASSIST_LIGHT = 0xC305; /** * Shutter speed in Av mode * 0 = Automatic * 1 = 1/200 (fixed) */ public static final int TAG_CANON_CUSTOM_FUNCTION_SHUTTER_SPEED_IN_AV_MODE = 0xC306; /** * Auto-Exposure Bracketting sequence/auto cancellation * 0 = 0,-,+ / Enabled * 1 = 0,-,+ / Disabled * 2 = -,0,+ / Enabled * 3 = -,0,+ / Disabled */ public static final int TAG_CANON_CUSTOM_FUNCTION_BRACKETTING = 0xC307; /** * Shutter Curtain Sync * 0 = 1st Curtain Sync * 1 = 2nd Curtain Sync */ public static final int TAG_CANON_CUSTOM_FUNCTION_SHUTTER_CURTAIN_SYNC = 0xC308; /** * Lens Auto-Focus stop button Function Switch * 0 = AF stop * 1 = Operate AF * 2 = Lock AE and start timer */ public static final int TAG_CANON_CUSTOM_FUNCTION_AF_STOP = 0xC309; /** * Auto reduction of fill flash * 0 = Enable * 1 = Disable */ public static final int TAG_CANON_CUSTOM_FUNCTION_FILL_FLASH_REDUCTION = 0xC30A; /** * Menu button return position * 0 = Top * 1 = Previous (volatile) * 2 = Previous */ public static final int TAG_CANON_CUSTOM_FUNCTION_MENU_BUTTON_RETURN = 0xC30B; /** * SET button function when shooting * 0 = Not Assigned * 1 = Change Quality * 2 = Change ISO Speed * 3 = Select Parameters */ public static final int TAG_CANON_CUSTOM_FUNCTION_SET_BUTTON_FUNCTION = 0xC30C; /** * Sensor cleaning * 0 = Disable * 1 = Enable */ public static final int TAG_CANON_CUSTOM_FUNCTION_SENSOR_CLEANING = 0xC30D; // 9 A B C D E F 10 11 12 13 // 9 10 11 12 13 14 15 16 17 18 19 protected static final HashMap _tagNameMap = new HashMap(); static { _tagNameMap.put(new Integer(TAG_CANON_FIRMWARE_VERSION), "Firmware Version"); _tagNameMap.put(new Integer(TAG_CANON_IMAGE_NUMBER), "Image Number"); _tagNameMap.put(new Integer(TAG_CANON_IMAGE_TYPE), "Image Type"); _tagNameMap.put(new Integer(TAG_CANON_OWNER_NAME), "Owner Name"); _tagNameMap.put(new Integer(TAG_CANON_UNKNOWN_1), "Makernote Unknown 1"); _tagNameMap.put(new Integer(TAG_CANON_CUSTOM_FUNCTIONS), "Custom Functions"); _tagNameMap.put(new Integer(TAG_CANON_SERIAL_NUMBER), "Camera Serial Number"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_AF_POINT_SELECTED), "AF Point Selected"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_CONTINUOUS_DRIVE_MODE), "Continuous Drive Mode"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_CONTRAST), "Contrast"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_EASY_SHOOTING_MODE), "Easy Shooting Mode"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_EXPOSURE_MODE), "Exposure Mode"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_FLASH_DETAILS), "Flash Details"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_FLASH_MODE), "Flash Mode"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_FOCAL_UNITS_PER_MM), "Focal Units per mm"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_FOCUS_MODE_1), "Focus Mode"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_FOCUS_MODE_2), "Focus Mode"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_IMAGE_SIZE), "Image Size"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_ISO), "Iso"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_LONG_FOCAL_LENGTH), "Long Focal Length"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_MACRO_MODE), "Macro Mode"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_METERING_MODE), "Metering Mode"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_SATURATION), "Saturation"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_SELF_TIMER_DELAY), "Self Timer Delay"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_SHARPNESS), "Sharpness"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_SHORT_FOCAL_LENGTH), "Short Focal Length"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_QUALITY), "Quality"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_UNKNOWN_2), "Unknown Camera State 2"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_UNKNOWN_3), "Unknown Camera State 3"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_UNKNOWN_4), "Unknown Camera State 4"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_DIGITAL_ZOOM), "Digital Zoom"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_FOCUS_TYPE), "Focus Type"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_UNKNOWN_7), "Unknown Camera State 7"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_UNKNOWN_8), "Unknown Camera State 8"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_UNKNOWN_9), "Unknown Camera State 9"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_UNKNOWN_10), "Unknown Camera State 10"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_FLASH_ACTIVITY), "Flash Activity"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_UNKNOWN_12), "Unknown Camera State 12"); _tagNameMap.put(new Integer(TAG_CANON_STATE1_UNKNOWN_13), "Unknown Camera State 13"); _tagNameMap.put(new Integer(TAG_CANON_STATE2_WHITE_BALANCE), "White Balance"); _tagNameMap.put(new Integer(TAG_CANON_STATE2_SEQUENCE_NUMBER), "Sequence Number"); _tagNameMap.put(new Integer(TAG_CANON_STATE2_AF_POINT_USED), "AF Point Used"); _tagNameMap.put(new Integer(TAG_CANON_STATE2_FLASH_BIAS), "Flash Bias"); _tagNameMap.put(new Integer(TAG_CANON_STATE2_AUTO_EXPOSURE_BRACKETING), "Auto Exposure Bracketing"); _tagNameMap.put(new Integer(TAG_CANON_STATE2_AEB_BRACKET_VALUE), "AEB Bracket Value"); _tagNameMap.put(new Integer(TAG_CANON_STATE2_SUBJECT_DISTANCE), "Subject Distance"); _tagNameMap.put(new Integer(TAG_CANON_CUSTOM_FUNCTION_LONG_EXPOSURE_NOISE_REDUCTION), "Long Exposure Noise Reduction"); _tagNameMap.put(new Integer(TAG_CANON_CUSTOM_FUNCTION_SHUTTER_AUTO_EXPOSURE_LOCK_BUTTONS), "Shutter/Auto Exposure-lock Buttons"); _tagNameMap.put(new Integer(TAG_CANON_CUSTOM_FUNCTION_MIRROR_LOCKUP), "Mirror Lockup"); _tagNameMap.put(new Integer(TAG_CANON_CUSTOM_FUNCTION_TV_AV_AND_EXPOSURE_LEVEL), "Tv/Av And Exposure Level"); _tagNameMap.put(new Integer(TAG_CANON_CUSTOM_FUNCTION_AF_ASSIST_LIGHT), "AF-Assist Light"); _tagNameMap.put(new Integer(TAG_CANON_CUSTOM_FUNCTION_SHUTTER_SPEED_IN_AV_MODE), "Shutter Speed in Av Mode"); _tagNameMap.put(new Integer(TAG_CANON_CUSTOM_FUNCTION_BRACKETTING), "Auto-Exposure Bracketting Sequence/Auto Cancellation"); _tagNameMap.put(new Integer(TAG_CANON_CUSTOM_FUNCTION_SHUTTER_CURTAIN_SYNC), "Shutter Curtain Sync"); _tagNameMap.put(new Integer(TAG_CANON_CUSTOM_FUNCTION_AF_STOP), "Lens Auto-Focus Stop Button Function Switch"); _tagNameMap.put(new Integer(TAG_CANON_CUSTOM_FUNCTION_FILL_FLASH_REDUCTION), "Auto Reduction of Fill Flash"); _tagNameMap.put(new Integer(TAG_CANON_CUSTOM_FUNCTION_MENU_BUTTON_RETURN), "Menu Button Return Position"); _tagNameMap.put(new Integer(TAG_CANON_CUSTOM_FUNCTION_SET_BUTTON_FUNCTION), "SET Button Function When Shooting"); _tagNameMap.put(new Integer(TAG_CANON_CUSTOM_FUNCTION_SENSOR_CLEANING), "Sensor Cleaning"); } public CanonMakernoteDirectory() { this.setDescriptor(new CanonMakernoteDescriptor(this)); } public String getName() { return "Canon Makernote"; } protected HashMap getTagNameMap() { return _tagNameMap; } /** * We need special handling for selected tags. * @param tagType * @param ints */ public void setIntArray(int tagType, int[] ints) { if (tagType == TAG_CANON_CAMERA_STATE_1) { // this single tag has multiple values within int subTagTypeBase = 0xC100; // we intentionally skip the first array member for (int i = 1; i < ints.length; i++) { setInt(subTagTypeBase + i, ints[i]); } } else if (tagType == TAG_CANON_CAMERA_STATE_2) { // this single tag has multiple values within int subTagTypeBase = 0xC200; // we intentionally skip the first array member for (int i = 1; i < ints.length; i++) { setInt(subTagTypeBase + i, ints[i]); } } if (tagType == TAG_CANON_CUSTOM_FUNCTIONS) { // this single tag has multiple values within int subTagTypeBase = 0xC300; // we intentionally skip the first array member for (int i = 1; i < ints.length; i++) { setInt(subTagTypeBase + i + 1, ints[i] & 0x0F); } } else { // no special handling... super.setIntArray(tagType, ints); } } }