@Eric-Katzfey Idk if you are still interested but I fixed the bug in the voxl-camera-server. It turnes out whoever wrote it didn't do research on how exif format works. The exif data that was being appended to the image was written in intel byteorder while the camera uses motorolla byteorder. I think your HAL driver needs to check the byteordering when the camera is being set up. But here is the fix that works for the IMX214 camera:
// degrees, min, seconds is each a Radional
// a rational is two uint32 numbers
entry = create_tag(exif, EXIF_IFD_GPS, (ExifTag)EXIF_TAG_GPS_LATITUDE, 3*sizeof(ExifRational));
entry->format = EXIF_FORMAT_RATIONAL;
entry->components = 3;
ExifLong degrees_lat = static_cast<ExifLong>(gps_grabbed_info.latitude);
double fractional = (gps_grabbed_info.latitude - degrees_lat);
ExifLong minutes_lat = static_cast<ExifLong>(fractional*60);
fractional = (fractional*60) - minutes_lat;
double seconds = (fractional * 60);
ExifRational degrees_r = { degrees_lat*10, 10 };
ExifRational minutes_r = { minutes_lat, 1 };
ExifRational seconds_r = { static_cast<ExifLong>(seconds * 1000000), 1000000 }; // Increased precision for seconds
//ExifRational seconds_r = { static_cast<ExifLong>(seconds), 1 };
//ExifRational seconds_r = { 3375UL, 100UL };
printf("Seconds int:%u\n", seconds_r.numerator);
printf("Seconds double:%lf\n", seconds);
exif_set_rational(entry->data, EXIF_BYTE_ORDER_MOTOROLA, degrees_r);
exif_set_rational(entry->data + sizeof(ExifRational), EXIF_BYTE_ORDER_MOTOROLA, minutes_r);
exif_set_rational(entry->data + 2 * sizeof(ExifRational), EXIF_BYTE_ORDER_MOTOROLA, seconds_r);