From 586c49b3cc178c1b454749ba1bc76b5814f93737 Mon Sep 17 00:00:00 2001 From: Dennis Real Date: Fri, 21 Dec 2012 22:01:42 +0100 Subject: Some more nikon exif features: - ISO - Whitebalance - PictureControlData - Flash output power --- src/exif_cfg.h | 11 +++++- src/exif_nikon.c | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 121 insertions(+), 4 deletions(-) diff --git a/src/exif_cfg.h b/src/exif_cfg.h index 31acc50..a3344bc 100644 --- a/src/exif_cfg.h +++ b/src/exif_cfg.h @@ -36,6 +36,7 @@ typedef struct /* show these standard tags. section must be given first, than the tag itself */ +/* definition: http://libexif.sourceforge.net/api/exif-tag_8h.html */ const t_EXIF_INFO Exif_tag_list [] = { {EXIF_IFD_0, EXIF_TAG_MAKE}, @@ -67,15 +68,21 @@ const t_EXIF_INFO Exif_tag_list [] = /* show these nikon makernote tags */ const unsigned int Exif_makernote_nikon_tag_list [] = { + + 6, 8, /* Flash Setting */ 9, /* Flash Mode */ 24, /* Flash exposure bracket value */ 135, /* Flash used */ 168, /* Flash info: control mode */ - + + 2, /* ISO. Has some more info than EXIF_TAG_ISO_SPEED_RATINGS but also fails on Lo.1 */ + 5, /* White Balance */ 132, /* Lens */ 171, /* Digital Vari-Program */ - 34, /* ActiveD-Lighting */ + 34, /* Active D-Lighting */ + + 35, /* PictureControlData */ 183, /* AFInfo2 */ EXIF_NIKON_MAKERNOTE_END /* end marker */ diff --git a/src/exif_nikon.c b/src/exif_nikon.c index f4a8eea..21a2f08 100644 --- a/src/exif_nikon.c +++ b/src/exif_nikon.c @@ -95,11 +95,20 @@ char * EXN_Prim_AF_Pt_39[EXN_PRIM_AF_PT_39_MAX] = {"(none)", "C6 (Center)", "B6" "C3", "B3", "D3", "C2", "B2", "D2", "C1", "B1", "D1"}; +#define EXN_PIC_CTRL_ADJ_MAX 3 +char * EXN_Pic_Ctrl_Adj[EXN_PIC_CTRL_ADJ_MAX] = {"Default Settings", + "Quick Adjust", + "Full Control"}; + + + static void exn_get_prim_af_pt(unsigned int phasedetectaf, unsigned int primafpt, char * buffer, unsigned int maxsize); +static void exn_get_flash_output(unsigned int flashoutput, char * buffer, unsigned int maxsize); static void exn_get_mnote_nikon_34(ExifData *ed, char * buffer, unsigned int maxsize); +static void exn_get_mnote_nikon_35(ExifData *ed, char * buffer, unsigned int maxsize); static void exn_get_mnote_nikon_168(ExifData *ed, char * buffer, unsigned int maxsize); static void exn_get_mnote_nikon_183(ExifData *ed, char * buffer, unsigned int maxsize); @@ -164,6 +173,32 @@ static void exn_get_prim_af_pt(unsigned int phasedetectaf, +/* get flash output power (for FlashInfo010x) */ +static void exn_get_flash_output(unsigned int flashoutput, char * buffer, unsigned int maxsize) +{ + + if ( flashoutput == 0 ) + { + /* full power */ + snprintf(buffer, maxsize, "Full"); + } + else + { + if ( (flashoutput % 6) == 0 ) + { + /* value is a power of 2 */ + snprintf(buffer, maxsize, "1/%d", 1<<(flashoutput/6)); + } + else + { + /* something uneven...ugly. maybe introduce pow() function from libm later */ + snprintf(buffer, maxsize, "1/2^(%f)", ((float)flashoutput)/6.0); + } + } +} + + + /* get ActiveD-Lighting (34) info */ static void exn_get_mnote_nikon_34(ExifData *ed, char * buffer, unsigned int maxsize) { @@ -220,6 +255,63 @@ static void exn_get_mnote_nikon_34(ExifData *ed, char * buffer, unsigned int max +/* get nikon PictureControlData (35) info */ +static void exn_get_mnote_nikon_35(ExifData *ed, char * buffer, unsigned int maxsize) +{ + char buf[EXIF_STD_BUF_LEN]; + char picturecontrolname[EXIF_STD_BUF_LEN]; + char picturecontrolbase[EXIF_STD_BUF_LEN]; + unsigned int version = 0; + unsigned int length = 0; + unsigned int piccontroladj = 0; + unsigned int piccontrolquickadj = 0; + unsigned int sharpness = 0; + unsigned int contrast = 0; + unsigned int brightness = 0; + unsigned int saturation = 0; + unsigned int hueadjustment = 0; + unsigned int i, j; + + /* libexif does not support PictureControlData 35 yet. so we have to parse the debug data :-( */ + buf[0] = '\0'; + exif_get_mnote_tag(ed, 35, buf, sizeof(buf)); + + sscanf(buf, "(null): %u bytes unknown data: 303130%02X%40s%40s%*8s%02X%02X%02X%02X%02X%02X%02X", + &length, &version, &picturecontrolname[0], &picturecontrolbase[0], + &piccontroladj, &piccontrolquickadj, + &sharpness, &contrast, &brightness, &saturation, &hueadjustment + ); + + /* printf("--%s %d-%d-\n", buf, version, piccontroladj); */ + + for ( i=0; i<40; i++ ) + { + sscanf(&picturecontrolname[2*i], "%2X", &j); + picturecontrolname[i] = j; + sscanf(&picturecontrolbase[2*i], "%2X", &j); + picturecontrolbase[i] = j; + + } + exif_trim_spaces(picturecontrolname); + exif_trim_spaces(picturecontrolbase); + + if ( ((length == 58) && (version == '0')) + && (piccontroladj < EXN_PIC_CTRL_ADJ_MAX) + + ) + { + snprintf(buffer, maxsize, + "PictCtrlData: Name: %s; Base: %s; CtrlAdj: %s; Quick: %d; Shrp: %d; Contr: %d; Brght: %d; Sat: %d; Hue: %d\n", + picturecontrolname, picturecontrolbase, + EXN_Pic_Ctrl_Adj[piccontroladj], piccontrolquickadj, + sharpness, contrast, brightness, saturation, hueadjustment); + } + +} + + + + /* get nikon Flash info: control mode (168) info */ static void exn_get_mnote_nikon_168(ExifData *ed, char * buffer, unsigned int maxsize) { @@ -227,11 +319,13 @@ static void exn_get_mnote_nikon_168(ExifData *ed, char * buffer, unsigned int ma unsigned int version = 0; unsigned int length = 0; unsigned int exn_fcm = (EXN_FLASH_CONTROL_MODES_MAX-1); /* default to N/A */ + unsigned int flashoutput = 0; + unsigned int externalflashflags = 0; /* libexif does not support flash info 168 yet. so we have to parse the debug data :-( */ buf[0] = '\0'; exif_get_mnote_tag(ed, 168, buf, sizeof(buf)); - sscanf(buf, "(null): %u bytes unknown data: 303130%02X%*10s%02X", &length, &version, &exn_fcm); + sscanf(buf, "(null): %u bytes unknown data: 303130%02X%*8s%02X%02X%02X", &length, &version, &externalflashflags, &exn_fcm, &flashoutput); exn_fcm = exn_fcm & EXN_FLASH_CONTROL_MODE_MASK; if ( (exn_fcm < EXN_FLASH_CONTROL_MODES_MAX) @@ -242,7 +336,16 @@ static void exn_get_mnote_nikon_168(ExifData *ed, char * buffer, unsigned int ma ) ) { - snprintf(buffer, maxsize, "NikonFlashControlMode: %s\n", EXN_NikonFlashControlModeValues[exn_fcm]); + + buf[0] = '\0'; + exn_get_flash_output(flashoutput, buf, EXIF_STD_BUF_LEN); + snprintf(buffer, maxsize, "NikonFlashControlMode: %s (Power: %s)\n", EXN_NikonFlashControlModeValues[exn_fcm], buf); + + /* External Flash Flags. Not as useful as expected. Not used (yet). */ + /* if ( (externalflashflags & (1<<2)) ) -> Bounce Flash */ + /* if ( (externalflashflags & (1<<4)) ) -> Wide Flash Adapter */ + /* if ( (externalflashflags & (1<<5)) ) -> Dome Diffusor */ + } } @@ -336,6 +439,13 @@ void exn_get_mnote_nikon_tags(ExifData *ed, unsigned int tag, char * buffer, uns exn_get_mnote_nikon_34(ed, buffer, maxsize); } break; + + case 35: + { + /* PictureControlData */ + exn_get_mnote_nikon_35(ed, buffer, maxsize); + } + break; case 168: { -- cgit v1.2.3