gint format_olympus_makernote(ExifData *exif, unsigned char *tiff, guint offset, guint size, ExifByteOrder bo) { unsigned char *data; ExifItem *item; if (offset + 8 + 4 >= size) return FALSE; data = tiff + offset; /* Olympus tag format starts with "OLYMP\x00\x01" or "OLYMP\x00\x02", * plus an unknown byte, * followed by IFD data using Olympus tags. */ if (memcmp(data, "OLYMP\x00\x01", 7) != 0 && memcmp(data, "OLYMP\x00\x02", 7) != 0) return FALSE; if (exif_parse_IFD_table(exif, tiff, offset + 8, size, bo, 0, OlympusExifMarkersList) != 0) { return FALSE; } item = exif_get_item(exif, "Olympus.SpecialMode"); if (item && item->data_len == 3 * sizeof(guint32)) { static ExifMarker marker = { 0x0200, EXIF_FORMAT_STRING, -1, "Olympus.ShootingMode", "Shooting mode", NULL }; guint32 *array = item->data; gchar *mode; gchar *pdir = NULL; gchar *text; gint l; mode = exif_text_list_find_value(OlympusShootingMode, array[0]); if (array[0] == 3) { pdir = exif_text_list_find_value(OlympusPanoramaDirection, array[2]); } text = g_strdup_printf("%s%s%s, seq %d", mode, (pdir) ? " " : "", (pdir) ? pdir : "", array[1] + 1); l = strlen(text) + 1; item = exif_item_new(marker.format, marker.tag, l, &marker); memcpy(item->data, text, l); g_free(text); g_free(pdir); g_free(mode); exif->items = g_list_prepend(exif->items, item); } item = exif_get_item(exif, "Olympus.WhiteBalance"); if (item && item->data_len == 2 * sizeof(guint16)) { static ExifMarker marker = { 0x1015, EXIF_FORMAT_STRING, -1, "Olympus.WhiteBalance", "White balance", NULL }; guint16 *array = item->data; gchar *mode; gchar *color = NULL; gchar *text; gint l; mode = exif_text_list_find_value(OlympusWB, array[0]); if (array[0] == 2) { color = exif_text_list_find_value(OlympusWBColorTemp, array[1]); } text = g_strdup_printf("%s%s%s", mode, (color) ? " " : "", (color) ? color : ""); l = strlen(text) + 1; item = exif_item_new(marker.format, marker.tag, l, &marker); memcpy(item->data, text, l); g_free(text); g_free(color); g_free(mode); exif->items = g_list_prepend(exif->items, item); } return TRUE; }
gboolean format_nikon_makernote(ExifData *exif, guchar *tiff, guint offset, guint size, ExifByteOrder bo) { guchar *data; ExifItem *item; if (offset + 8 + 4 >= size) return FALSE; data = tiff + offset; /* Nikon tag format 1 */ if (memcmp(data, "Nikon\x00\x01\x00", 8) == 0) { if (exif_parse_IFD_table(exif, tiff, offset + 8, size, bo, 0, NikonExifMarkersList1) != 0) { return FALSE; } return TRUE; } /* Nikon tag format 2 uses Embedded tiff header */ if (memcmp(data, "Nikon\x00\x02\x00\x00\x00", 10) == 0 || memcmp(data, "Nikon\x00\x02\x10\x00\x00", 10) == 0) { guint tiff_header; tiff_header = offset + 10; if (exif_tiff_parse(exif, tiff + tiff_header, size - tiff_header, NikonExifMarkersList2) != 0) { return FALSE; } } /* Nikon tag format 3 uses format 2 tags without "Nikon" and tiff header */ else if (exif_parse_IFD_table(exif, tiff, offset, size, bo, 0, NikonExifMarkersList2) != 0) { return FALSE; } item = exif_get_item(exif, "Nikon.AutoFocusArea"); if (item && item->data_len == 4 * sizeof(guchar)) { static ExifMarker marker = { 0x0088, EXIF_FORMAT_STRING, -1, "Nikon.AutoFocusPoint", "Auto focus point", NULL }; guchar *array = item->data; gchar *text; gint l; text = exif_text_list_find_value(NikonAFPoint, (gint)array[1]); l = strlen(text) + 1; item = exif_item_new(marker.format, marker.tag, l, &marker); memcpy(item->data, text, l); g_free(text); exif->items = g_list_prepend(exif->items, item); } item = exif_get_item(exif, "Nikon.ISOSpeed"); if (item && item->data_len == 2 * 2) { static ExifMarker marker = { 0x0002, EXIF_FORMAT_SHORT_UNSIGNED, 1, "ISOSpeedRatings", "ISO speed", NULL }; ExifItem *shadow; shadow = exif_item_new(marker.format, marker.tag, 1, &marker); memcpy(shadow->data, item->data + 2, 2); exif->items = g_list_prepend(exif->items, shadow); } item = exif_get_item(exif, "Nikon.WhiteBalance"); if (item && item->format == EXIF_FORMAT_STRING) { static ExifMarker marker = { 0x0005, EXIF_FORMAT_STRING, -1, "LightSource", "Light source", NULL }; ExifItem *shadow; shadow = exif_item_new(marker.format, marker.tag, item->data_len, &marker); memcpy(shadow->data, item->data, item->data_len); exif->items = g_list_prepend(exif->items, shadow); } return TRUE; }