Commit 586c49b3 authored by Dennis Real's avatar Dennis Real
Browse files

Some more nikon exif features:

- ISO
- Whitebalance
- PictureControlData
- Flash output power
parent 98b0add5
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -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,  /* Active D-Lighting */

  35,  /* PictureControlData */
  183, /* AFInfo2 */

  EXIF_NIKON_MAKERNOTE_END   /* end marker */
+112 −2
Original line number Diff line number Diff line
@@ -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 */

  }

}
@@ -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 */