summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/exif.c11
-rw-r--r--src/exif_cfg.h21
-rw-r--r--src/exif_nikon.c161
-rw-r--r--src/exif_nikon.h2
4 files changed, 133 insertions, 62 deletions
diff --git a/src/exif.c b/src/exif.c
index 91e1735..ed18eb5 100644
--- a/src/exif.c
+++ b/src/exif.c
@@ -279,7 +279,16 @@ void exif_get_info(ExifData * ed, char *buffer, unsigned int maxsize)
)
{
/* this is a nikon camera */
- exn_get_mnote_nikon_tags(ed, buffer + strlen(buffer), maxsize - strlen(buffer));
+
+ /* show nikon makernote exif tags. list must be defined in exif_cfg.h */
+ i=0;
+ while ( (Exif_makernote_nikon_tag_list[i] != EXIF_NIKON_MAKERNOTE_END) && (i < USHRT_MAX) )
+ {
+ exn_get_mnote_nikon_tags(ed, Exif_makernote_nikon_tag_list[i],
+ buffer + strlen(buffer), maxsize - strlen(buffer));
+ i++;
+ }
+
}
}
diff --git a/src/exif_cfg.h b/src/exif_cfg.h
index c828f43..5ceb357 100644
--- a/src/exif_cfg.h
+++ b/src/exif_cfg.h
@@ -34,8 +34,8 @@ typedef struct
ExifTag tag; /* tag */
} t_EXIF_INFO;
+
/* show these standard tags. section must be given first, than the tag itself */
-/* note: maker note specific tags are handled directly in exif.c up to now */
const t_EXIF_INFO Exif_tag_list [] =
{
{EXIF_IFD_0, EXIF_TAG_MAKE},
@@ -58,4 +58,23 @@ const t_EXIF_INFO Exif_tag_list [] =
{EXIF_IFD_COUNT, 0} /* end marker */
};
+
+#define EXIF_NIKON_MAKERNOTE_END 0 /* end marker: if 0 used as a tag we must find something else */
+
+/* show these nikon makernote tags */
+const unsigned int Exif_makernote_nikon_tag_list [] =
+{
+ 8, /* Flash Setting */
+ 9, /* Flash Mode */
+ 24, /* Flash exposure bracket value */
+ 135, /* Flash used */
+ 168, /* Flash info: control mode */
+
+ 132, /* Lens */
+ 171, /* Digital Vari-Program */
+ 183, /* AFInfo2 */
+
+ EXIF_NIKON_MAKERNOTE_END /* end marker */
+};
+
#endif
diff --git a/src/exif_nikon.c b/src/exif_nikon.c
index d9e83a1..42f1137 100644
--- a/src/exif_nikon.c
+++ b/src/exif_nikon.c
@@ -100,10 +100,12 @@ static void exn_get_prim_af_pt(unsigned int phasedetectaf,
unsigned int primafpt,
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);
+
+
+/* get primary AF point */
static void exn_get_prim_af_pt(unsigned int phasedetectaf,
unsigned int primafpt,
char * buffer,
@@ -162,59 +164,46 @@ static void exn_get_prim_af_pt(unsigned int phasedetectaf,
-/* get interesting nikon maker note tags in readable form */
-void exn_get_mnote_nikon_tags(ExifData *ed, char * buffer, unsigned int maxsize)
+/* get nikon Flash info: control mode (168) info */
+static void exn_get_mnote_nikon_168(ExifData *ed, char * buffer, unsigned int maxsize)
{
char buf[EXIF_STD_BUF_LEN];
- unsigned int exn_fcm = (EXN_FLASH_CONTROL_MODES_MAX-1); /* default to N/A */
unsigned int version = 0;
unsigned int length = 0;
- unsigned int contrastdetectaf = 0;
- unsigned int afareamode = 0;
- unsigned int phasedetectaf = 0;
- unsigned int primaryafpoint = 0;
+ unsigned int exn_fcm = (EXN_FLASH_CONTROL_MODES_MAX-1); /* default to N/A */
+ /* libexif does not support flash info 168 yet. so we have to parse the debug data :-( */
buf[0] = '\0';
- exif_get_tag(ed, EXIF_IFD_EXIF, EXIF_TAG_FLASH, buf, sizeof(buf));
- exif_trim_spaces(buf);
-
- if ( !(strcmp("Flash: Flash did not fire\n", buf) == 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);
+ exn_fcm = exn_fcm & EXN_FLASH_CONTROL_MODE_MASK;
+
+ if ( (exn_fcm < EXN_FLASH_CONTROL_MODES_MAX)
+ && ( ((length == 22) && (version == '3')) /* Nikon FlashInfo0103 */
+ || ((length == 22) && (version == '4')) /* Nikon FlashInfo0104 */
+ || ((length == 21) && (version == '2')) /* Nikon FlashInfo0102 */
+ || ((length == 19) && (version == '0')) /* Nikon FlashInfo0100 */
+ )
+ )
{
- /* show extended flash info if flash was fired */
-
- /* Flash Setting */
- exif_get_mnote_tag(ed, 8, buffer + strlen(buffer), maxsize - strlen(buffer));
- /* Flash Mode */
- exif_get_mnote_tag(ed, 9, buffer + strlen(buffer), maxsize - strlen(buffer));
- /* flash exposure bracket value */
- exif_get_mnote_tag(ed, 24, buffer + strlen(buffer), maxsize - strlen(buffer));
- /* Flash used */
- exif_get_mnote_tag(ed, 135, buffer + strlen(buffer), maxsize - strlen(buffer));
-
- /* Flash info: control mode. */
- /* 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);
- exn_fcm = exn_fcm & EXN_FLASH_CONTROL_MODE_MASK;
-
- if ( (exn_fcm < EXN_FLASH_CONTROL_MODES_MAX)
- && ( ((length == 22) && (version == '3')) /* Nikon FlashInfo0103 */
- || ((length == 22) && (version == '4')) /* Nikon FlashInfo0104 */
- || ((length == 21) && (version == '2')) /* Nikon FlashInfo0102 */
- || ((length == 19) && (version == '0')) /* Nikon FlashInfo0100 */
- )
- )
- {
- snprintf(buffer + strlen(buffer), maxsize - strlen(buffer), "NikonFlashControlMode: %s\n",
- EXN_NikonFlashControlModeValues[exn_fcm]);
- }
+ snprintf(buffer + strlen(buffer), maxsize - strlen(buffer), "NikonFlashControlMode: %s\n",
+ EXN_NikonFlashControlModeValues[exn_fcm]);
}
- /* Lens */
- exif_get_mnote_tag(ed, 132, buffer + strlen(buffer), maxsize - strlen(buffer));
- /* Digital Vari-Program */
- exif_get_mnote_tag(ed, 171, buffer + strlen(buffer), maxsize - strlen(buffer));
+}
+
+
+
+/* get nikon AFInfo2 (183) info */
+static void exn_get_mnote_nikon_183(ExifData *ed, char * buffer, unsigned int maxsize)
+{
+ char buf[EXIF_STD_BUF_LEN];
+ unsigned int contrastdetectaf = 0;
+ unsigned int afareamode = 0;
+ unsigned int phasedetectaf = 0;
+ unsigned int primaryafpoint = 0;
+ unsigned int version = 0;
+ unsigned int length = 0;
/* AFInfo2 */
/* libexif does not support AFInfo2 183 yet. so we have to parse the debug data :-( */
@@ -231,34 +220,88 @@ void exn_get_mnote_nikon_tags(ExifData *ed, char * buffer, unsigned int maxsize)
if ( ((length == 30) && (version == '0'))
&& (contrastdetectaf < EXN_CONTRAST_DETECT_AF_MAX)
&& (phasedetectaf < EXN_PHASE_DETECT_AF_MAX)
-
- )
+ )
{
if ( (contrastdetectaf != 0) && (afareamode < EXN_AF_AREA_MODE_C_MAX) )
{
/* Contrast AF (live view) */
snprintf(buffer + strlen(buffer), maxsize - strlen(buffer),
- "ContrastDetectAF: %s; AFAreaMode: %s\n",
- EXN_NikonContrastDetectAF[contrastdetectaf],
- EXN_NikonAFAreaModeContr[afareamode]);
-
+ "ContrastDetectAF: %s; AFAreaMode: %s\n",
+ EXN_NikonContrastDetectAF[contrastdetectaf],
+ EXN_NikonAFAreaModeContr[afareamode]);
+
}
else if ( (phasedetectaf != 0) && (afareamode < EXN_AF_AREA_MODE_P_MAX) )
{
/* Phase AF */
buf[0] = '\0';
exn_get_prim_af_pt(phasedetectaf, primaryafpoint, buf, EXIF_STD_BUF_LEN);
-
+
snprintf(buffer + strlen(buffer), maxsize - strlen(buffer),
- "PhaseDetectAF: %s; AreaMode: %s; PrimaryAFPoint: %s\n",
- EXN_NikonPhaseDetectAF[phasedetectaf],
- EXN_NikonAFAreaModePhase[afareamode],
- buf
- );
+ "PhaseDetectAF: %s; AreaMode: %s; PrimaryAFPoint: %s\n",
+ EXN_NikonPhaseDetectAF[phasedetectaf],
+ EXN_NikonAFAreaModePhase[afareamode],
+ buf
+ );
}
+
+ }
+}
+
+
+
+/* get interesting nikon maker note tags in readable form */
+void exn_get_mnote_nikon_tags(ExifData *ed, unsigned int tag, char * buffer, unsigned int maxsize)
+{
+ char buf[EXIF_STD_BUF_LEN];
+
+ buf[0] = '\0';
+ exif_get_tag(ed, EXIF_IFD_EXIF, EXIF_TAG_FLASH, buf, sizeof(buf));
+ exif_trim_spaces(buf);
+
+ switch(tag)
+ {
+ /* show only if flash was used */
+ case 8: /* Flash Setting */
+ case 9: /* Flash Mode */
+ case 24: /* Flash exposure bracket value */
+ case 135: /* Flash used */
+ {
+ if ( !(strcmp("Flash: Flash did not fire\n", buf) == 0) )
+ {
+ /* show extended flash info only if flash was fired */
+ exif_get_mnote_tag(ed, tag, buffer + strlen(buffer), maxsize - strlen(buffer));
+ }
+ }
+ break;
+ case 168:
+ {
+ /* Flash info: control mode */
+ if ( !(strcmp("Flash: Flash did not fire\n", buf) == 0) )
+ {
+ /* show extended flash info only if flash was fired */
+ exn_get_mnote_nikon_168(ed, buffer + strlen(buffer), maxsize - strlen(buffer));
+ }
+ }
+ break;
+
+ case 183:
+ {
+ /* AFInfo 2 */
+ exn_get_mnote_nikon_183(ed, buffer + strlen(buffer), maxsize - strlen(buffer));
+ }
+ break;
+
+ default:
+ {
+ /* normal makernote tags without special treatment */
+ exif_get_mnote_tag(ed, tag, buffer + strlen(buffer), maxsize - strlen(buffer));
+ }
+ break;
}
+
return;
}
diff --git a/src/exif_nikon.h b/src/exif_nikon.h
index f12b5ce..16e8fb9 100644
--- a/src/exif_nikon.h
+++ b/src/exif_nikon.h
@@ -28,6 +28,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <libexif/exif-data.h>
-extern void exn_get_mnote_nikon_tags(ExifData *ed, char * buffer, unsigned int maxsize);
+extern void exn_get_mnote_nikon_tags(ExifData *ed, unsigned int tag, char * buffer, unsigned int maxsize);
#endif