info: optionally recurse into certain MakerNotes
This commit is contained in:
parent
f196b03e97
commit
51ca3f8e2e
35
tools/info.h
35
tools/info.h
@ -123,6 +123,39 @@ parse_exif_subifds(const struct tiffer *T, struct tiffer_entry *entry,
|
||||
return a;
|
||||
}
|
||||
|
||||
// Implemented partially, out of curiosity--it is not particularly useful,
|
||||
// because there is a ton more parsing to do here.
|
||||
static bool
|
||||
parse_exif_makernote(jv *v, const struct tiffer_entry *entry)
|
||||
{
|
||||
if (!getenv("INFO_MAKERNOTE") ||
|
||||
entry->tag != Exif_MakerNote || entry->type != TIFFER_UNDEFINED)
|
||||
return false;
|
||||
|
||||
struct tiffer T = {};
|
||||
if (entry->remaining_count >= 16 &&
|
||||
!memcmp(entry->p, "Nikon\x00\x02", 7) &&
|
||||
tiffer_init(&T, entry->p + 10, entry->remaining_count - 10) &&
|
||||
tiffer_next_ifd(&T)) {
|
||||
*v = parse_exif_ifd(&T, NULL);
|
||||
return true;
|
||||
}
|
||||
if (entry->remaining_count >= 16 &&
|
||||
!memcmp(entry->p, "Apple iOS\x00\x00\x01MM", 14)) {
|
||||
T.un = &tiffer_unbe;
|
||||
T.begin = T.p = entry->p + 14;
|
||||
T.end = entry->p + entry->remaining_count - 14;
|
||||
T.remaining_fields = 0;
|
||||
|
||||
struct tiffer subT = {};
|
||||
if (tiffer_subifd(&T, 0, &subT)) {
|
||||
*v = parse_exif_ifd(&subT, NULL);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static jv
|
||||
parse_exif_ascii(struct tiffer_entry *entry)
|
||||
{
|
||||
@ -198,6 +231,8 @@ parse_exif_entry(jv o, const struct tiffer *T, struct tiffer_entry *entry,
|
||||
v = parse_exif_subifds(T, entry, subentries);
|
||||
} else if (entry->type == TIFFER_ASCII) {
|
||||
v = parse_exif_extract_sole_array_element(parse_exif_ascii(entry));
|
||||
} else if (info_begin == exif_entries && parse_exif_makernote(&v, entry)) {
|
||||
// Already processed.
|
||||
} else if (entry->type == TIFFER_UNDEFINED && !info->values) {
|
||||
// Several Exif entries of UNDEFINED type contain single-byte numbers.
|
||||
v = parse_exif_undefined(entry);
|
||||
|
Loading…
Reference in New Issue
Block a user