From 008ab7fc0f43161e0eedfddbaa80fe28c4f9ff13 Mon Sep 17 00:00:00 2001 From: Dennis Real Date: Fri, 4 Jan 2013 00:09:31 +0100 Subject: Workaround for broken Flash Exposure Compensation --- src/exif_cfg.h | 2 +- src/exif_nikon.c | 35 +++++++++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/exif_cfg.h b/src/exif_cfg.h index a3344bc..a961147 100644 --- a/src/exif_cfg.h +++ b/src/exif_cfg.h @@ -72,8 +72,8 @@ const unsigned int Exif_makernote_nikon_tag_list [] = 6, 8, /* Flash Setting */ 9, /* Flash Mode */ - 24, /* Flash exposure bracket value */ 135, /* Flash used */ + 18, /* Flash Exposure Comp */ 168, /* Flash info: control mode */ 2, /* ISO. Has some more info than EXIF_TAG_ISO_SPEED_RATINGS but also fails on Lo.1 */ diff --git a/src/exif_nikon.c b/src/exif_nikon.c index 21a2f08..7ee6e86 100644 --- a/src/exif_nikon.c +++ b/src/exif_nikon.c @@ -107,6 +107,7 @@ static void exn_get_prim_af_pt(unsigned int phasedetectaf, 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_18(ExifData *ed, 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); @@ -199,6 +200,23 @@ static void exn_get_flash_output(unsigned int flashoutput, char * buffer, unsign +/* get ActiveD-Lighting (18) info */ +static void exn_get_mnote_nikon_18(ExifData *ed, char * buffer, unsigned int maxsize) +{ + + char buf[EXIF_STD_BUF_LEN]; + float data = 0; + + buf[0] = '\0'; + exif_get_mnote_tag(ed, 18, buf, sizeof(buf)); + + sscanf(buf, "Flash Exposure Compensation: %f", &data); /* libexif buggy here. fix conversion */ + + snprintf(buffer, maxsize, "FlashExposureCompensation: %.1f\n", ((float)((signed char)round(data*6.0))) / 6.0 ); +} + + + /* get ActiveD-Lighting (34) info */ static void exn_get_mnote_nikon_34(ExifData *ed, char * buffer, unsigned int maxsize) { @@ -321,13 +339,16 @@ static void exn_get_mnote_nikon_168(ExifData *ed, char * buffer, unsigned int ma unsigned int exn_fcm = (EXN_FLASH_CONTROL_MODES_MAX-1); /* default to N/A */ unsigned int flashoutput = 0; unsigned int externalflashflags = 0; + unsigned int flashcompensation = 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%*8s%02X%02X%02X", &length, &version, &externalflashflags, &exn_fcm, &flashoutput); + sscanf(buf, "(null): %u bytes unknown data: 303130%02X%*8s%02X%02X%02X%02X", &length, &version, &externalflashflags, &exn_fcm, &flashoutput, &flashcompensation); exn_fcm = exn_fcm & EXN_FLASH_CONTROL_MODE_MASK; + /* printf("%s - %d %d %d %d\n", buf, externalflashflags, exn_fcm, flashoutput, (signed char)flashcompensation); */ + if ( (exn_fcm < EXN_FLASH_CONTROL_MODES_MAX) && ( ((length == 22) && (version == '3')) /* Nikon FlashInfo0103 */ || ((length == 22) && (version == '4')) /* Nikon FlashInfo0104 */ @@ -422,7 +443,7 @@ void exn_get_mnote_nikon_tags(ExifData *ed, unsigned int tag, char * buffer, uns /* show only if flash was used */ case 8: /* Flash Setting */ case 9: /* Flash Mode */ - case 24: /* Flash exposure bracket value */ + case 27: /* Flash exposure bracket value */ case 135: /* Flash used */ { if ( !(strcmp("Flash: Flash did not fire\n", buf) == 0) ) @@ -433,6 +454,16 @@ void exn_get_mnote_nikon_tags(ExifData *ed, unsigned int tag, char * buffer, uns } break; + case 18: /* FlashExposureComp */ + { + if ( !(strcmp("Flash: Flash did not fire\n", buf) == 0) ) + { + /* show only if flash was fired */ + exn_get_mnote_nikon_18(ed, buffer, maxsize); + } + } + break; + case 34: { /* ActiveD-Lighting */ -- cgit v1.2.3