+// insert spherical tag
+ if(asset->jpeg_sphere)
+ {
+ const char *sphere_tag =
+ "http://ns.adobe.com/xap/1.0/\x00<?xpacket begin='\xef\xbb\xbf' id='W5M0MpCehiHzreSzNTczkc9d'?>\n"
+ "<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::Cinelerra'>\n"
+ "<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>\n"
+ "\n"
+ " <rdf:Description rdf:about=''\n"
+ " xmlns:GPano='http://ns.google.com/photos/1.0/panorama/'>\n"
+ " <GPano:ProjectionType>equirectangular</GPano:ProjectionType>\n"
+ " </rdf:Description>\n"
+ "</rdf:RDF>\n"
+ "</x:xmpmeta>\n"
+ "<?xpacket end='w'?>";
+
+// calculate length by skipping the \x00 byte
+ int skip = 32;
+ int tag_len = strlen(sphere_tag + skip) + skip;
+ int tag_len2 = tag_len + 2;
+ int tag_len3 = tag_len + 4;
+
+ data->allocate_compressed_data(
+ mjpeg_output_size((mjpeg_t*)jpeg_unit->compressor) + tag_len3);
+ data->set_compressed_size(
+ mjpeg_output_size((mjpeg_t*)jpeg_unit->compressor) + tag_len3);
+
+ int jfif_size = 0x14;
+ uint8_t *ptr = data->get_data();
+ memcpy(ptr,
+ mjpeg_output_buffer((mjpeg_t*)jpeg_unit->compressor),
+ jfif_size);
+ ptr += jfif_size;
+ *ptr++ = 0xff;
+ *ptr++ = 0xe1;
+ *ptr++ = (tag_len2 >> 8) & 0xff;
+ *ptr++ = tag_len2 & 0xff;
+ memcpy(ptr,
+ sphere_tag,
+ tag_len);
+ ptr += tag_len;
+ memcpy(ptr,
+ mjpeg_output_buffer((mjpeg_t*)jpeg_unit->compressor) + jfif_size,
+ mjpeg_output_size((mjpeg_t*)jpeg_unit->compressor) - jfif_size);
+ }
+ else
+ {
+ data->allocate_compressed_data(mjpeg_output_size((mjpeg_t*)jpeg_unit->compressor));
+ data->set_compressed_size(mjpeg_output_size((mjpeg_t*)jpeg_unit->compressor));
+ memcpy(data->get_data(),
+ mjpeg_output_buffer((mjpeg_t*)jpeg_unit->compressor),
+ mjpeg_output_size((mjpeg_t*)jpeg_unit->compressor));
+ }