[tracker/libtracker-extract-fixes] tracker-extract, libtracker-extract: Resolution unit is important



commit 70fe7d82a6b04a7d20713b453066e00108fd29b8
Author: Philip Van Hoof <philip codeminded be>
Date:   Tue Apr 13 18:01:17 2010 +0200

    tracker-extract, libtracker-extract: Resolution unit is important

 src/libtracker-extract/tracker-exif.c      |   21 ++++++++++++++++
 src/libtracker-extract/tracker-exif.h      |    1 +
 src/tracker-extract/tracker-extract-jpeg.c |   36 +++++++++++++++++++++++----
 src/tracker-extract/tracker-extract-png.c  |   13 +++++----
 src/tracker-extract/tracker-extract-tiff.c |   14 ++++++----
 5 files changed, 67 insertions(+), 18 deletions(-)
---
diff --git a/src/libtracker-extract/tracker-exif.c b/src/libtracker-extract/tracker-exif.c
index f9ea24b..32c4f8e 100644
--- a/src/libtracker-extract/tracker-exif.c
+++ b/src/libtracker-extract/tracker-exif.c
@@ -278,6 +278,24 @@ get_white_balance (ExifData *exif,
 	return NULL;
 }
 
+
+static gint
+get_int (ExifData *exif, 
+         ExifTag   tag)
+{
+	ExifEntry *entry = exif_data_get_entry (exif, tag);
+
+	if (entry) {
+		ExifByteOrder order;
+
+		order = exif_data_get_byte_order (exif);
+		return (gint) exif_get_short (entry->data, order);
+	}
+
+	return -1;
+}
+
+
 static gchar *
 get_value (ExifData *exif, 
            ExifTag   tag)
@@ -366,6 +384,9 @@ parse_exif (const unsigned char *buffer,
 		data->copyright = get_value (exif, EXIF_TAG_COPYRIGHT);
 	if (!data->software)
 		data->software = get_value (exif, EXIF_TAG_SOFTWARE);
+
+	if (!data->resolution_unit)
+		data->resolution_unit = get_int (exif, EXIF_TAG_RESOLUTION_UNIT);
 	if (!data->x_resolution)
 		data->x_resolution = get_value (exif, EXIF_TAG_X_RESOLUTION);
 	if (!data->y_resolution)
diff --git a/src/libtracker-extract/tracker-exif.h b/src/libtracker-extract/tracker-exif.h
index c50be2a..35276be 100644
--- a/src/libtracker-extract/tracker-exif.h
+++ b/src/libtracker-extract/tracker-exif.h
@@ -52,6 +52,7 @@ typedef struct {
 	gchar *software;
 	gchar *x_resolution;
 	gchar *y_resolution;
+	gint resolution_unit;
 } TrackerExifData;
 
 #ifndef TRACKER_DISABLE_DEPRECATED
diff --git a/src/tracker-extract/tracker-extract-jpeg.c b/src/tracker-extract/tracker-extract-jpeg.c
index b895dd7..6dc6781 100644
--- a/src/tracker-extract/tracker-extract-jpeg.c
+++ b/src/tracker-extract/tracker-extract-jpeg.c
@@ -35,6 +35,8 @@
 
 #include "tracker-main.h"
 
+#define INCH_TO_CM              0.393700787
+
 #ifdef HAVE_LIBEXIF
 #define EXIF_NAMESPACE          "Exif"
 #define EXIF_NAMESPACE_LENGTH   4
@@ -573,19 +575,41 @@ extract_jpeg (const gchar          *uri,
 	}
 
 	if (cinfo.density_unit != 0 || ed->x_resolution) {
-		gint value;
+		gdouble value;
+
+		if (cinfo.density_unit == 0) {
+			if (ed->resolution_unit == 1)
+				value = g_strtod (ed->x_resolution, NULL);
+			else
+				value = g_strtod (ed->x_resolution, NULL) * INCH_TO_CM;
+		} else {
+			if (cinfo.density_unit == 1)
+				value = cinfo.X_density;
+			else
+				value = cinfo.X_density * INCH_TO_CM;
+		}
 
-		value = cinfo.density_unit != 0 ? cinfo.X_density : atoi (ed->x_resolution);
 		tracker_sparql_builder_predicate (metadata, "nfo:horizontalResolution");
-		tracker_sparql_builder_object_int64 (metadata, (gint64) value);
+		tracker_sparql_builder_object_double (metadata, value);
 	}
 
 	if (cinfo.density_unit != 0 || ed->y_resolution) {
-		gint value;
+		gdouble value;
+
+		if (cinfo.density_unit == 0) {
+			if (ed->resolution_unit == 1)
+				value = g_strtod (ed->y_resolution, NULL);
+			else
+				value = g_strtod (ed->y_resolution, NULL) * INCH_TO_CM;
+		} else {
+			if (cinfo.density_unit == 1)
+				value = cinfo.Y_density;
+			else
+				value = cinfo.Y_density * INCH_TO_CM;
+		}
 
-		value = cinfo.density_unit != 0 ? cinfo.Y_density : atoi (ed->y_resolution);
 		tracker_sparql_builder_predicate (metadata, "nfo:verticalResolution");
-		tracker_sparql_builder_object_int64 (metadata, (gint64) value);
+		tracker_sparql_builder_object_double (metadata, value);
 	}
 
 	jpeg_destroy_decompress (&cinfo);
diff --git a/src/tracker-extract/tracker-extract-png.c b/src/tracker-extract/tracker-extract-png.c
index f743ec2..6c8a4b4 100644
--- a/src/tracker-extract/tracker-extract-png.c
+++ b/src/tracker-extract/tracker-extract-png.c
@@ -31,6 +31,7 @@
 #include <libtracker-extract/tracker-extract.h>
 
 #define RFC1123_DATE_FORMAT "%d %B %Y %H:%M:%S %z"
+#define INCH_TO_CM          0.393700787
 
 typedef struct {
 	const gchar *title;
@@ -469,19 +470,19 @@ read_metadata (TrackerSparqlBuilder *preupdate,
 	}
 
 	if (ed->x_resolution) {
-		gint value;
+		gdouble value;
 
-		value = atoi (ed->x_resolution);
+		value = ed->resolution_unit == 1 ? g_strtod (ed->x_resolution, NULL) : g_strtod (ed->x_resolution, NULL) * INCH_TO_CM;
 		tracker_sparql_builder_predicate (metadata, "nfo:horizontalResolution");
-		tracker_sparql_builder_object_int64 (metadata, (gint64) value);
+		tracker_sparql_builder_object_double (metadata, value);
 	}
 
 	if (ed->y_resolution) {
-		gint value;
+		gdouble value;
 
-		value = atoi (ed->y_resolution);
+		value = ed->resolution_unit == 1 ? g_strtod (ed->y_resolution, NULL) : g_strtod (ed->y_resolution, NULL) * INCH_TO_CM;
 		tracker_sparql_builder_predicate (metadata, "nfo:verticalResolution");
-		tracker_sparql_builder_object_int64 (metadata, (gint64) value);
+		tracker_sparql_builder_object_double (metadata, value);
 	}
 
 	tracker_exif_free (ed);
diff --git a/src/tracker-extract/tracker-extract-tiff.c b/src/tracker-extract/tracker-extract-tiff.c
index cc114ee..78b9e02 100644
--- a/src/tracker-extract/tracker-extract-tiff.c
+++ b/src/tracker-extract/tracker-extract-tiff.c
@@ -27,6 +27,8 @@
 #include <libtracker-client/tracker-client.h>
 #include <libtracker-extract/tracker-extract.h>
 
+#define INCH_TO_CM          0.393700787
+
 typedef enum {
 	TAG_TYPE_UNDEFINED = 0,
 	TAG_TYPE_STRING,
@@ -677,19 +679,19 @@ extract_tiff (const gchar          *uri,
 	}
 
 	if (ed->x_resolution) {
-		gint value;
+		gdouble value;
 
-		value = atoi (ed->x_resolution);
+		value = ed->resolution_unit == 1 ? g_strtod (ed->x_resolution, NULL) : g_strtod (ed->x_resolution, NULL) * INCH_TO_CM;
 		tracker_sparql_builder_predicate (metadata, "nfo:horizontalResolution");
-		tracker_sparql_builder_object_int64 (metadata, (gint64) value);
+		tracker_sparql_builder_object_double (metadata, value);
 	}
 
 	if (ed->y_resolution) {
-		gint value;
+		gdouble value;
 
-		value = atoi (ed->y_resolution);
+		value = ed->resolution_unit == 1 ? g_strtod (ed->y_resolution, NULL) : g_strtod (ed->y_resolution, NULL) * INCH_TO_CM;
 		tracker_sparql_builder_predicate (metadata, "nfo:verticalResolution");
-		tracker_sparql_builder_object_int64 (metadata, (gint64) value);
+		tracker_sparql_builder_object_double (metadata, value);
 	}
 
 	g_free (md.camera);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]