Image-EXIF
view release on metacpan or search on metacpan
* 4. Neither the name of the author nor the names of any co-contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: canon.c,v 1.54 2007/12/16 03:06:13 ejohnst Exp $
*/
/*
* Exif tag definitions for Canon maker notes.
* Developed from http://www.burren.cx/david/canon.html.
* EOS 1D and 1Ds contributions from Stan Jirman <stanj@phototrek.org>.
* EOS 10D contributions from Jason Montojo <jason.montojo@rogers.com>.
* EOS 20D contributions from Per Kristian Hove <Per.Hove@math.ntnu.no>.
* EOS 5D contributions from Albert Max Lai <amlai@columbia.edu>.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "makers.h"
/*
* Calculate and format an exposure value ("-n.nn EV").
*/
static float
calcev(char *c, int l, int16_t v)
{
#if 0 /* Adjustment seems silly. If someone complains, I'll reconsider. */
int16_t n;
/*
* XXX 1/3 and 2/3 values seem to be a bit off. This makes a
* slight adjustment; may want to revisit.
*/
n = (abs(v) - 32) * (v & 0x8000 ? -1 : 1);
if (n == 20 || n == -12) v++;
else if (n == -20 || n == 12) v--;
#endif
if (c) snprintf(c, l, "%.2f EV", (float)v / 32);
return ((float)v / 32);
}
/* Macro mode. */
static struct descrip canon_macro[] = {
{ 1, "Macro" },
{ 2, "Normal" },
{ -1, "Unknown" },
};
/* Focus type. */
static struct descrip canon_focustype[] = {
{ 0, "Manual" },
{ 1, "Auto" },
{ 2, "Auto" },
{ 3, "Close-Up (Macro Mode)" },
{ 7, "Infinity Mode" },
{ 8, "Locked (Pan Mode)" },
{ -1, "Unknown" },
};
/* Quality. */
static struct descrip canon_quality[] = {
{ 2, "Normal" },
{ 3, "Fine" },
{ 5, "Superfine" },
{ -1, "Unknown" },
};
/* Flash mode. */
static struct descrip canon_flash[] = {
{ 0, "Off" },
{ 1, "Auto" },
{ 2, "On" },
{ 3, "Red-Eye Reduction" },
{ 4, "Slow-Synchro" },
{ 5, "Red-Eye Reduction (Auto)" },
{ 6, "Red-Eye Reduction (On)" },
{ 16, "External Flash" },
{ -1, "Unknown" },
};
/* Drive mode. */
static struct descrip canon_drive[] = {
{ 0, "Single" }, /* "Timed" when field 2 is > 0. */
{ 1, "Continuous" },
{ -1, "Unknown" },
};
/* Focus mode. */
static struct descrip canon_focus1[] = {
{ 0, "One-Shot" },
{ 1, "AI Servo" },
{ 2, "AI Focus" },
{ 3, "Manual" },
{ 4, "Single" },
{ 5, "Continuous" },
{ 6, "Manual" },
{ -1, "Unknown" },
};
/* Image size. */
static struct descrip canon_imagesz[] = {
{ 0, "Large" },
{ 1, "Medium" },
{ 2, "Small" },
{ -1, "Unknown" },
};
/* Shooting mode. */
static struct descrip canon_shoot[] = {
{ 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" },
{ 19, "Indoor" },
{ 22, "Underwater" },
{ 24, "Kids & Pets" },
{ 25, "Night Snapshot" },
{ -1, "Unknown" },
};
/* Digital zoom. */
static struct descrip canon_dzoom[] = {
{ 0, "None" },
{ 1, "x2" },
{ 2, "x4" },
{ -1, "Unknown" },
};
/* Contrast, saturation, & sharpness. */
static struct descrip canon_range[] = {
{ 0, "Normal" },
{ 1, "High" },
{ 0xffff, "Low" },
{ -1, "Unknown" },
};
/* ISO speed rating. */
static struct descrip canon_iso[] = {
{ 15, "Auto" },
{ 16, "50" },
{ 17, "100" },
{ 18, "200" },
{ 19, "400" },
{ -1, "Unknown" },
};
/* Metering mode. */
static struct descrip canon_meter[] = {
{ 0, "Default" },
{ 1, "Spot" },
{ 3, "Evaluative" },
{ 4, "Partial" },
{ 5, "Center-Weighted" },
{ -1, "Unknown" },
};
/* Exposure mode. */
static struct descrip canon_expmode[] = {
{ 0, "Easy Shooting" },
{ 1, "Program" },
{ 2, "Tv-Priority" },
{ 3, "Av-Priority" },
/* White balance. */
static struct descrip canon_whitebal[] = {
{ 0, "Auto" },
{ 1, "Daylight" },
{ 2, "Cloudy" },
{ 3, "Tungsten" },
{ 4, "Fluorescent" },
{ 5, "Flash" },
{ 6, "Custom" },
{ 7, "Black & White" },
{ 8, "Shade" },
{ 9, "Manual Temperature" },
{ 14, "Daylight Fluorescent" },
{ 15, "Custom 1" },
{ 16, "Custom 2" },
{ 17, "Underwater" },
{ -1, "Unknown" },
};
/* Maker note IFD tags. */
static struct exiftag canon_tags[] = {
{ 0x0001, TIFF_SHORT, 0, ED_UNK, "Canon1Tag",
"Canon Tag1 Offset", NULL },
{ 0x0004, TIFF_SHORT, 0, ED_UNK, "Canon4Tag",
"Canon Tag4 Offset", NULL },
{ 0x0006, TIFF_ASCII, 32, ED_VRB, "ImageType",
"Image Type", NULL },
{ 0x0007, TIFF_ASCII, 24, ED_CAM, "FirmwareVer",
"Firmware Version", NULL },
{ 0x0008, TIFF_LONG, 1, ED_IMG, "ImgNum",
"Image Number", NULL },
{ 0x0009, TIFF_ASCII, 32, ED_CAM, "OwnerName",
"Owner Name", NULL },
{ 0x000c, TIFF_LONG, 1, ED_CAM, "Serial",
"Serial Number", NULL },
{ 0x000f, TIFF_SHORT, 0, ED_UNK, "CustomFunc",
"Custom Function", NULL },
{ 0x0090, TIFF_SHORT, 0, ED_UNK, "CustomFunc",
"Custom Function", NULL },
{ 0x0093, TIFF_SHORT, 0, ED_UNK, "Canon93Tag",
"Canon Tag93 Offset", NULL },
{ 0x0095, TIFF_ASCII, 64, ED_PAS, "LensName",
"Lens Name", NULL },
{ 0x00a0, TIFF_SHORT, 0, ED_UNK, "CanonA0Tag",
"Canon TagA0 Offset", NULL },
{ 0xffff, TIFF_UNKN, 0, ED_UNK, "CanonUnknown",
"Canon Unknown", NULL },
};
/* Fields under tag 0x0001 (camera settings). */
static struct exiftag canon_tags01[] = {
{ 0, TIFF_SHORT, 0, ED_VRB, "Canon1Len",
"Canon Tag1 Length", NULL },
{ 1, TIFF_SHORT, 0, ED_IMG, "CanonMacroMode",
"Macro Mode", canon_macro },
{ 2, TIFF_SHORT, 0, ED_VRB, "CanonTimerLen",
"Self-Timer Length", NULL },
{ 3, TIFF_SHORT, 0, ED_IMG, "CanonQuality",
"Compression Setting", canon_quality },
{ 4, TIFF_SHORT, 0, ED_IMG, "CanonFlashMode",
"Flash Mode", canon_flash },
{ 5, TIFF_SHORT, 0, ED_IMG, "CanonDriveMode",
"Drive Mode", canon_drive },
{ 7, TIFF_SHORT, 0, ED_IMG, "CanonFocusMode",
"Focus Mode", canon_focus1 },
{ 10, TIFF_SHORT, 0, ED_IMG, "CanonImageSize",
"Image Size", canon_imagesz },
{ 11, TIFF_SHORT, 0, ED_IMG, "CanonShootMode",
"Shooting Mode", canon_shoot },
{ 12, TIFF_SHORT, 0, ED_VRB, "CanonDigiZoom",
"Digital Zoom", NULL },
{ 13, TIFF_SHORT, 0, ED_IMG, "CanonContrast",
"Contrast", canon_range },
{ 14, TIFF_SHORT, 0, ED_IMG, "CanonSaturate",
"Saturation", canon_range },
{ 15, TIFF_SHORT, 0, ED_IMG, "CanonSharpness",
"Sharpness", canon_range },
{ 16, TIFF_SHORT, 0, ED_IMG, "CanonISO",
"ISO Speed Rating", canon_iso },
{ 17, TIFF_SHORT, 0, ED_IMG, "CanonMeterMode",
"Metering Mode", canon_meter },
{ 18, TIFF_SHORT, 0, ED_IMG, "CanonFocusType",
"Focus Type", canon_focustype },
{ 19, TIFF_SHORT, 0, ED_UNK, "CanonAFPoint",
"Autofocus Point", NULL },
{ 20, TIFF_SHORT, 0, ED_IMG, "CanonExpMode",
"Exposure Mode", canon_expmode },
{ 23, TIFF_SHORT, 0, ED_UNK, "CanonMaxFocal",
"Max Focal Length", NULL },
{ 24, TIFF_SHORT, 0, ED_UNK, "CanonMinFocal",
"Min Focal Length", NULL },
{ 25, TIFF_SHORT, 0, ED_UNK, "CanonFocalUnits",
"Focal Units/mm", NULL },
{ 28, TIFF_SHORT, 0, ED_UNK, "CanonFlashAct",
"Flash Activity", NULL },
{ 29, TIFF_SHORT, 0, ED_UNK, "CanonFlashDet",
"Flash Details", NULL },
{ 36, TIFF_SHORT, 0, ED_VRB, "CanonDZoomRes",
"Zoomed Resolution", NULL },
{ 37, TIFF_SHORT, 0, ED_VRB, "CanonBZoomRes",
"Base Zoom Resolution", NULL },
{ 0xffff, TIFF_SHORT, 0, ED_UNK, "Canon01Unknown",
"Canon Tag1 Unknown", NULL },
};
/* Fields under tag 0x0004 (shot info). */
static struct exiftag canon_tags04[] = {
{ 0, TIFF_SHORT, 0, ED_VRB, "Canon4Len",
"Canon Tag4 Length", NULL },
{ 2, TIFF_SHORT, 0, ED_IMG, "CanonSensorSpeed",
"Sensor ISO Speed", NULL },
{ 6, TIFF_SHORT, 0, ED_IMG, "CanonExpComp",
"Exposure Compensation", NULL },
( run in 1.702 second using v1.01-cache-2.11-cpan-98e64b0badf )