diff options
| author | Daniel Friesel <derf@finalrewind.org> | 2012-02-26 22:34:28 +0100 | 
|---|---|---|
| committer | Daniel Friesel <derf@finalrewind.org> | 2012-02-26 22:34:28 +0100 | 
| commit | 3ceed32cd8f56cd4c970b31ed03c15549bcb396d (patch) | |
| tree | 57542d7d6a0434facc5a4d8e7b75c9e85a7f7eb4 /src | |
| parent | b257e011c4390900f14491e2cffe38b2d00892ec (diff) | |
| parent | f24e46871c9eb41f2b43e91b18164c3d232255f8 (diff) | |
Merge branch 'master' of aneurysm:var/git_root/feh
Diffstat (limited to 'src')
| -rw-r--r-- | src/exif.c | 52 | ||||
| -rw-r--r-- | src/exif_nikon.h | 41 | ||||
| -rw-r--r-- | src/list.c | 5 | 
3 files changed, 91 insertions, 7 deletions
| @@ -33,7 +33,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  #include "options.h"  #include "debug.h"  #include "exif.h" - +#include "exif_nikon.h"  /* remove all spaces on the right end of a string */ @@ -140,7 +140,10 @@ ExifData * exif_get_data(char *path)  void exif_get_info(ExifData * ed, char *buffer, unsigned int maxsize)  {    ExifEntry *entry = NULL; -  char buf[64]; +  char buf[128]; +  unsigned int exn_fcm = (EXN_FLASH_CONTROL_MODES_MAX-1); /* default to N/A */ +  unsigned int version = 0; +  unsigned int length = 0;    if ( (buffer == NULL) || (maxsize == 0) )    { @@ -151,7 +154,7 @@ void exif_get_info(ExifData * ed, char *buffer, unsigned int maxsize)      snprintf(buffer, (size_t)maxsize, "%s\n", "No Exif data in file.");      return;    } -  else if ( ed != NULL ) +  else    {      /* normal exif tags */      exif_get_tag(ed, EXIF_IFD_0, EXIF_TAG_MAKE, buffer, maxsize); @@ -185,10 +188,49 @@ void exif_get_info(ExifData * ed, char *buffer, unsigned int maxsize)          /* Nikon */                                              if ( strcmp(buf, "Nikon") != 0 )          { -          /* Digital Vari-Program */ -          exif_get_mnote_tag(ed, 171, buffer + strlen(buffer), maxsize - strlen(buffer)); +          /* this is a nikon camera */ +           +          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) ) +          { +            /* extended flash info if it 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]); +            } +          }            /* 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)); +          }        } diff --git a/src/exif_nikon.h b/src/exif_nikon.h new file mode 100644 index 0000000..e2baf0d --- /dev/null +++ b/src/exif_nikon.h @@ -0,0 +1,41 @@ +/* exif_nikon.h + +Copyright (C) 2012      Dennis Real. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies of the Software and its documentation and acknowledgment shall be +given in the documentation and software packages that this Software was +used. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*/ + +#ifndef EXIF_NIKON_H +#define EXIF_NIKON_H + +/* Flash control mode */ +/* http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#FlashControlMode */ +#define EXN_FLASH_CONTROL_MODES_MAX 9 +char *EXN_NikonFlashControlModeValues[EXN_FLASH_CONTROL_MODES_MAX] = {"Off",  +                                       "iTTL-BL", "iTTL", "Auto Aperture",  +                                       "Automatic", "GN (distance priority)",  +                                       "Manual", "Repeating Flash",  +                                       "N/A" /* "N/A" is not a nikon setting */ +                                       }; + +#define EXN_FLASH_CONTROL_MODE_MASK 0x7F + +#endif @@ -44,14 +44,15 @@ void init_list_mode(void)  		file = FEH_FILE(l->data);  		if (opt.customlist)  			printf("%s\n", feh_printf(opt.customlist, file)); -		else +		else {  			printf("%d\t%s\t%d\t%d\t%s", ++j,  					file->info->format, file->info->width,  					file->info->height,  					format_size(file->info->pixels)); -			printf("\t%s\t\t%c\t%s\n", +			printf("\t%s\t%c\t%s\n",  					format_size(file->info->size),  					file->info->has_alpha ? 'X' : '-', file->filename); +		}  		feh_action_run(file, opt.actions[0]);  	} | 
