metadata: fix conversion of geo coordinates

Coordinate conversion has been verified with exiv2 and some webpages.
Minutes wher totally off and seconds were not used at all.
This commit is contained in:
Stefan Kost 2009-06-10 11:15:01 +03:00
parent 1cf9f2d497
commit f096d6406e

View file

@ -694,16 +694,16 @@ metadataparse_exif_content_foreach_entry_func (ExifEntry * entry,
/* DDD - degrees */ /* DDD - degrees */
value = (gdouble) rt->numerator / (gdouble) rt->denominator; value = (gdouble) rt->numerator / (gdouble) rt->denominator;
GST_DEBUG ("deg: %lu / %lu", rt->numerator, rt->denominator);
rt++; rt++;
/* MM - minutes and SS - seconds */ /* MM - minutes and SS - seconds */
if (rt->numerator % rt->denominator) { GST_DEBUG ("min: %lu / %lu", rt->numerator, rt->denominator);
value += (gdouble) rt->numerator / (gdouble) rt->denominator; value += (gdouble) rt->numerator / ((gdouble) rt->denominator * 60.0);
} else { rt++;
value += rt->numerator / rt->denominator; GST_DEBUG ("sec: %lu / %lu", rt->numerator, rt->denominator);
rt++; value +=
value += rt->numerator / rt->denominator; (gdouble) rt->numerator / ((gdouble) rt->denominator * 3600.0);
}
/* apply sign */ /* apply sign */
if (entry->tag == EXIF_TAG_GPS_LATITUDE) { if (entry->tag == EXIF_TAG_GPS_LATITUDE) {
@ -1049,17 +1049,24 @@ metadatamux_exif_for_each_tag_in_list (const GstTagList * list,
const ExifTag ref_tag = entry->tag == EXIF_TAG_GPS_LATITUDE ? const ExifTag ref_tag = entry->tag == EXIF_TAG_GPS_LATITUDE ?
EXIF_TAG_GPS_LATITUDE_REF : EXIF_TAG_GPS_LONGITUDE_REF; EXIF_TAG_GPS_LATITUDE_REF : EXIF_TAG_GPS_LONGITUDE_REF;
/* DDD - degrees */
rt->numerator = (gulong) v; rt->numerator = (gulong) v;
rt->denominator = 1; rt->denominator = 1;
GST_DEBUG ("deg: %lf : %lu / %lu", v, rt->numerator, rt->denominator);
v -= rt->numerator; v -= rt->numerator;
rt++; rt++;
rt->numerator = (gulong) (0.5 + v * 100.0); /* MM - minutes */
rt->denominator = 100; rt->numerator = (gulong) (v * 60.0);
rt->denominator = 1;
GST_DEBUG ("min: %lf : %lu / %lu", v, rt->numerator, rt->denominator);
v -= ((gdouble) rt->numerator / 60.0);
rt++; rt++;
rt->numerator = 0; /* SS - seconds */
rt->numerator = (gulong) (0.5 + v * 3600.0);
rt->denominator = 1; rt->denominator = 1;
GST_DEBUG ("sec: %lf : %lu / %lu", v, rt->numerator, rt->denominator);
if (entry->tag == EXIF_TAG_GPS_LONGITUDE) { if (entry->tag == EXIF_TAG_GPS_LONGITUDE) {
GST_DEBUG ("longitude : %lf", value); GST_DEBUG ("longitude : %lf", value);