Loading src/exif_cfg.h +9 −2 Original line number Diff line number Diff line Loading @@ -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}, Loading Loading @@ -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, /* Active D-Lighting */ 35, /* PictureControlData */ 183, /* AFInfo2 */ EXIF_NIKON_MAKERNOTE_END /* end marker */ Loading src/exif_nikon.c +112 −2 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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) { Loading @@ -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) Loading @@ -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 */ } } Loading Loading @@ -337,6 +440,13 @@ void exn_get_mnote_nikon_tags(ExifData *ed, unsigned int tag, char * buffer, uns } break; case 35: { /* PictureControlData */ exn_get_mnote_nikon_35(ed, buffer, maxsize); } break; case 168: { /* Flash info: control mode */ Loading Loading
src/exif_cfg.h +9 −2 Original line number Diff line number Diff line Loading @@ -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}, Loading Loading @@ -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, /* Active D-Lighting */ 35, /* PictureControlData */ 183, /* AFInfo2 */ EXIF_NIKON_MAKERNOTE_END /* end marker */ Loading
src/exif_nikon.c +112 −2 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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) { Loading @@ -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) Loading @@ -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 */ } } Loading Loading @@ -337,6 +440,13 @@ void exn_get_mnote_nikon_tags(ExifData *ed, unsigned int tag, char * buffer, uns } break; case 35: { /* PictureControlData */ exn_get_mnote_nikon_35(ed, buffer, maxsize); } break; case 168: { /* Flash info: control mode */ Loading