#define EXIF_IFD_TAG 0x8769
#define EXIF_GPS_IFD_TAG 0x8825
+#define EXIF_VERSION_TAG 0x9000
/* useful macros for speed tag */
#define METERS_PER_SECOND_TO_KILOMETERS_PER_HOUR (3.6)
{GST_TAG_COPYRIGHT, 0x8298, EXIF_TYPE_ASCII, 0, NULL, NULL},
{NULL, EXIF_IFD_TAG, EXIF_TYPE_LONG, 0, NULL, NULL},
{NULL, EXIF_GPS_IFD_TAG, EXIF_TYPE_LONG, 0, NULL, NULL},
+ {NULL, EXIF_VERSION_TAG, EXIF_TYPE_UNDEFINED, 0, NULL, NULL},
{NULL, 0, 0, 0, NULL, NULL}
};
}
static void
+write_exif_undefined_tag (GstExifWriter * writer, guint16 tag,
+ const guint8 * data, gint size)
+{
+ guint32 offset;
+
+ if (size > 4) {
+ /* we only use the data offset here, later we add up the
+ * resulting tag headers offset and the base offset */
+ offset = gst_byte_writer_get_size (&writer->datawriter);
+ gst_exif_writer_write_tag_header (writer, tag, EXIF_TYPE_UNDEFINED,
+ size, offset, FALSE);
+ gst_byte_writer_put_data (&writer->datawriter, data, size);
+ } else {
+ /* small enough to go in the offset */
+ memcpy ((guint8 *) & offset, data, size);
+ gst_exif_writer_write_tag_header (writer, tag, EXIF_TYPE_UNDEFINED,
+ size, offset, TRUE);
+ }
+}
+
+static void
write_exif_ascii_tag (GstExifWriter * writer, guint16 tag, const gchar * str)
{
gint size;
inner_tag_map = tag_map_gps;
} else if (tag_map[i].exif_tag == EXIF_IFD_TAG) {
inner_tag_map = tag_map_exif;
+ } else if (tag_map[i].exif_tag == EXIF_VERSION_TAG) {
+ /* special case where we write the exif version */
+ write_exif_undefined_tag (&writer, EXIF_VERSION_TAG, (guint8 *) "0230",
+ 4);
}
if (inner_tag_map) {
continue;
}
+ if (tagdata.tag == EXIF_VERSION_TAG) {
+ /* skip */
+ continue;
+ }
/* tags that need specialized deserialization */
if (tag_map[map_index].deserialize) {