Mercurial > geeqie
diff src/format_nikon.c @ 51:276ea4c98d33
Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
* exif.[ch]: Use glib provided data types and byte order functions for
consistency with rest of application. Made several more functions
available in the header. Use MakerNote parsing from format_raw.c.
* format_canon.[ch]: Changes to match exif.h and format_raw.h.
* format_fuji.[ch]: Add support for Fuji EXIF MakerNote.
* format_nikon.[ch]: New files, add support for Nikon EXIF MakerNote.
* format_raw.[ch]: Add EXIF MakerNote parser functions to gather all
camera formats here (similar to existing raw format list).
* src/Makefile.am: Add format_nikon.[ch].
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
##### an offical release when making enhancements and translation updates. #####
author | gqview |
---|---|
date | Sun, 05 Jun 2005 02:48:54 +0000 |
parents | |
children | 00843150f7c8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/format_nikon.c Sun Jun 05 02:48:54 2005 +0000 @@ -0,0 +1,248 @@ +/* + * GQView + * (C) 2005 John Ellis + * + * This software is released under the GNU General Public License (GNU GPL). + * Please read the included file COPYING for more information. + * This software comes with no warranty of any kind, use at your own risk! + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + + +#include <stdio.h> +#include <string.h> +#include <unistd.h> + +#include <glib.h> + +#include "intl.h" + +#include "format_nikon.h" + +#include "exif.h" + + +/* + *----------------------------------------------------------------------------- + * EXIF Makernote for Nikon + *----------------------------------------------------------------------------- + */ + +static ExifTextList NikonTagQuality[]= { + { 1, "VGA basic" }, + { 2, "VGA normal" }, + { 3, "VGA fine" }, + { 4, "SXGA basic" }, + { 5, "SXGA normal" }, + { 6, "SXGA fine" }, + { 7, "XGA basic (?)" }, + { 8, "XGA normal (?)" }, + { 9, "XGA fine (?)" }, + { 10, "UXGA basic" }, + { 11, "UXGA normal" }, + { 12, "UXGA fine" }, + EXIF_TEXT_LIST_END +}; + +static ExifTextList NikonTagColorMode[]= { + { 1, "color" }, + { 2, "monochrome" }, + EXIF_TEXT_LIST_END +}; + +static ExifTextList NikonTagImgAdjust[]= { + { 0, "normal" }, + { 1, "bright+" }, + { 2, "bright-" }, + { 3, "contrast+" }, + { 4, "contrast-" }, + EXIF_TEXT_LIST_END +}; + +static ExifTextList NikonTagISOSensitivity[]= { + { 0, "80" }, + { 2, "160" }, + { 4, "320" }, + { 5, "100" }, + EXIF_TEXT_LIST_END +}; + +static ExifTextList NikonTagWhiteBalance[]= { + { 0, "auto" }, + { 1, "preset" }, + { 2, "daylight" }, + { 3, "incandescent" }, + { 4, "fluorescence" }, + { 5, "cloudy" }, + { 6, "speedlight" }, + EXIF_TEXT_LIST_END +}; + +static ExifTextList NikonTagConverter[]= { + { 0, "none" }, + { 1, "Fisheye" }, + EXIF_TEXT_LIST_END +}; + +#if 0 +static ExifTextList NikonTag[]= { + { , "" }, + { , "" }, + EXIF_TEXT_LIST_END +}; +#endif + +static ExifMarker NikonExifMarkersList1[] = { +{ 0x0002, EXIF_FORMAT_STRING, 6, "MkN.Nikon.unknown", NULL, NULL }, +{ 0x0003, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Nikon.Quality", "Quality", NikonTagQuality }, +{ 0x0004, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Nikon.ColorMode", "Color mode", NikonTagColorMode }, +{ 0x0005, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Nikon.ImageAdjustment", + "Image adjustment", NikonTagImgAdjust }, +{ 0x0006, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Nikon.ISOSensitivity", + "ISO sensitivity", NikonTagISOSensitivity }, +{ 0x0007, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Nikon.WhiteBalance", + "White balance", NikonTagWhiteBalance }, +{ 0x0008, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "MkN.Nikon.Focus", "Focus", NULL }, +{ 0x000a, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "MkN.Nikon.DigitalZoom","Digital zoom", NULL }, +{ 0x000b, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Nikon.Converter", "Converter", NikonTagConverter }, +EXIF_MARKER_LIST_END +}; + +static ExifTextList NikonTag2FlashComp[]= { + { 0x06, "+1.0 EV" }, + { 0x04, "+0.7 EV" }, + { 0x03, "+0.5 EV" }, + { 0x02, "+0.3 EV" }, + { 0x00, "0.0 EV" }, + { 0xfe, "-0.3 EV" }, + { 0xfd, "-0.5 EV" }, + { 0xfc, "-0.7 EV" }, + { 0xfa, "-1.0 EV" }, + { 0xf8, "-1.3 EV" }, + { 0xf7, "-1.5 EV" }, + { 0xf6, "-1.7 EV" }, + { 0xf4, "-2.0 EV" }, + { 0xf2, "-2.3 EV" }, + { 0xf1, "-2.5 EV" }, + { 0xf0, "-2.7 EV" }, + { 0xee, "-3.0 EV" }, + EXIF_TEXT_LIST_END +}; + +static ExifTextList NikonTag2FlashUsed[]= { + { 0, "no" }, + { 9, "yes" }, + EXIF_TEXT_LIST_END +}; + +#if 0 +static ExifTextList NikonTagi2Saturation[]= { + { -3, "black and white" }, + { -2, "-2" }, + { -1, "-1" }, + { 0, "normal" }, + { 1, "+1" }, + { 2, "+2" }, + EXIF_TEXT_LIST_END +}; +#endif + +static ExifMarker NikonExifMarkersList2[] = { +{ 0x0002, EXIF_FORMAT_SHORT_UNSIGNED, 2, "MkN.Nikon.ISOSpeed", "ISO speed", NULL }, +{ 0x0003, EXIF_FORMAT_STRING, -1, "MkN.Nikon.ColorMode", "Color mode", NULL }, +{ 0x0004, EXIF_FORMAT_STRING, -1, "MkN.Nikon.Quality", "Quality", NULL }, +{ 0x0005, EXIF_FORMAT_STRING, -1, "MkN.Nikon.WhiteBalance", + "White balance", NULL }, +{ 0x0006, EXIF_FORMAT_STRING, -1, "MkN.Nikon.Sharpening", "Sharpening", NULL }, +{ 0x0007, EXIF_FORMAT_STRING, -1, "MkN.Nikon.FocusMode", "Focus mode", NULL }, +{ 0x0008, EXIF_FORMAT_STRING, -1, "MkN.Nikon.FlashSetting", + "Flash setting", NULL }, +{ 0x0009, EXIF_FORMAT_STRING, -1, "MkN.Nikon.AutoFlashMode","Auto flash mode",NULL }, +{ 0x000b, EXIF_FORMAT_SHORT, 1, "MkN.Nikon.WhiteBalanceBias", + "White balance bias value", NULL }, +/* { 0x000c, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Nikon.WhiteBalanceCoeff", + "White balance red/blue coefficents", NULL }, */ +/* { 0x000f, EXIF_FORMAT_STRING, -1, "MkN.Nikon.ISOSelect", "ISO selection",NULL }, */ +{ 0x0012, EXIF_FORMAT_UNDEFINED, 4, "MkN.Nikon.FlashCompensation", + "Flash compensation", NikonTag2FlashComp }, +{ 0x0013, EXIF_FORMAT_SHORT_UNSIGNED, 2, "MkN.Nikon.ISOSpeedRequest", + "ISO speed requested", NULL }, +{ 0x0016, EXIF_FORMAT_SHORT_UNSIGNED, 4, "MkN.Nikon.CornerCoord", + "Corner coordinates", NULL }, +{ 0x0018, EXIF_FORMAT_UNDEFINED, 4, "MkN.Nikon.FlashBracketCompensation", + "Flash bracket compensation", NikonTag2FlashComp }, +{ 0x0019, EXIF_FORMAT_RATIONAL, 1, "MkN.Nikon.AEBracketCompensation", + "AE bracket compensation", NULL }, +{ 0x0080, EXIF_FORMAT_STRING, -1, "MkN.Nikon.ImageAdjustment", + "Image adjustment", NULL }, +{ 0x0081, EXIF_FORMAT_STRING, -1, "MkN.Nikon.Contrast", "Contrast", NULL }, +{ 0x0082, EXIF_FORMAT_STRING, -1, "MkN.Nikon.AuxLens","Aux lens adapter", NULL }, +{ 0x0083, EXIF_FORMAT_BYTE_UNSIGNED, -1, "MkN.Nikon.LensType", "Lens type", NULL }, +{ 0x0084, EXIF_FORMAT_RATIONAL_UNSIGNED, -1, "MkN.Nikon.LensFocalLength", + "Lens min/max focal length and aperture", NULL }, +{ 0x0085, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Nikon.ManualFocusDistance", + "Manual focus distance", NULL }, +{ 0x0086, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Nikon.DigitalZoomFactor", + "Digital zoom facotr", NULL }, +{ 0x0087, EXIF_FORMAT_BYTE_UNSIGNED, 1, "MkN.Nikon.FlashUsed", "Flash used", NikonTag2FlashUsed }, +{ 0x0088, EXIF_FORMAT_UNDEFINED, -1, "MkN.Nikon.AutoFocusArea", NULL, NULL }, +/* { 0x0089, EXIF_FORMAT_SHORT_UNSIGNED, -1, "MkN.Nikon.Bracket/ShootingMode", NULL, NULL }, */ +{ 0x008d, EXIF_FORMAT_STRING, -1, "MkN.Nikon.ColorMode", "Color mode", NULL }, +{ 0x008f, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Nikon.SceneMode", NULL, NULL }, +{ 0x0090, EXIF_FORMAT_STRING, -1, "MkN.Nikon.LightingType", "Lighting type", NULL }, +{ 0x0092, EXIF_FORMAT_SHORT, 1, "MkN.Nikon.HueAdjust", "Hue adjustment", NULL }, +/* { 0x0094, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Nikon.Saturation", "Saturation", NikonTag2Saturation }, */ +{ 0x0095, EXIF_FORMAT_STRING, -1, "MkN.Nikon.NoiseReduction", "Noise reduction", NULL }, +{ 0x00a7, EXIF_FORMAT_LONG_UNSIGNED, 1, "MkN.Nikon.ShutterCount", "Shutter release count", NULL }, +{ 0x00a9, EXIF_FORMAT_STRING, -1, "MkN.Nikon.ImageOptimization", "Image optimization", NULL }, +{ 0x00aa, EXIF_FORMAT_STRING, -1, "MkN.Nikon.Saturation", "Saturation", NULL }, +{ 0x00ab, EXIF_FORMAT_STRING, -1, "MkN.Nikon.DigitalVariProg", "Digital Vari-program", NULL }, +EXIF_MARKER_LIST_END +}; + + +gint format_nikon_makernote(ExifData *exif, unsigned char *tiff, guint offset, + guint size, ExifByteOrder byte_order) +{ + unsigned char *data; + + if (offset + 8 + 4 >= size) return FALSE; + + data = tiff + offset; + if (memcmp(data, "Nikon\x00\x01\x00", 8) == 0) + { + if (exif_parse_IFD_table(exif, tiff, offset + 8, size, + byte_order, NikonExifMarkersList1) != 0) + { + return FALSE; + } + return TRUE; + } + + if (memcmp(data, "Nikon\x00\x02\x00\x00\x00", 10) == 0 || + memcmp(data, "Nikon\x00\x02\x10\x00\x00", 10) == 0) + { + guint tiff_header; + + tiff_header = offset + 10; + if (exif_parse_TIFF(exif, tiff + tiff_header, size - tiff_header, + NikonExifMarkersList2) != 0) + { + return FALSE; + } + return TRUE; + } + + /* fixme: support E990 and D1 */ + if (exif_parse_IFD_table(exif, tiff, offset, size, + byte_order, NikonExifMarkersList2) != 0) + { + return FALSE; + } + + return FALSE; +} +