frame->get_color_model(),
1);
+// 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));
+ }
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(),
parent_window->get_abs_cursor_x(1),
parent_window->get_abs_cursor_y(1),
400,
- 100)
+ 200)
{
this->parent_window = parent_window;
this->asset = asset;
int x = 10, y = 10;
lock_window("JPEGConfigVideo::create_objects");
add_subwindow(new BC_Title(x, y, _("Quality:")));
- add_subwindow(new BC_ISlider(x + 80,
- y,
- 0,
- 200,
- 200,
- 0,
- 100,
- asset->jpeg_quality,
- 0,
- 0,
+ BC_ISlider *slider;
+ add_subwindow(slider = new BC_ISlider(x + 80, y,
+ 0, 200, 200, 0, 100, asset->jpeg_quality, 0, 0,
&asset->jpeg_quality));
+ y += slider->get_h() + 10;
+ add_subwindow(new BC_CheckBox(x, y,
+ &asset->jpeg_sphere, _("Tag for spherical playback")));
add_subwindow(new BC_OKButton(this));
show_window(1);