+ if (_transcoder) { delete _transcoder; _transcoder = 0;}
+}
+
+void
+ExportVideoDialog::set_original_file_information()
+{
+ assert(_transcoder == 0);
+ std::string infile = invid_path_entry.get_text();
+
+ if (scale_checkbox.get_active()) {
+ // user may have set custom values already, don't touch.
+ return;
+ }
+ if (infile == "" || !Glib::file_test(infile, Glib::FILE_TEST_EXISTS)) {
+ return;
+ }
+
+ _transcoder = new TranscodeFfmpeg(infile);
+ if (_transcoder->probe_ok()) {
+ _video_source_aspect_ratio = -1;
+ width_spinner.set_value(_transcoder->get_width());
+ height_spinner.set_value(_transcoder->get_height());
+ _video_source_aspect_ratio = _transcoder->get_aspect();
+ }
+
+ delete _transcoder; _transcoder = 0;
+}
+void
+ExportVideoDialog::apply_state (TimeSelection &tme, bool range)
+{
+ _suspend_dirty = true; // TODO really just queue 'dirty' and mark session dirty on "Export"
+
+ export_range = tme;
+ _video_source_aspect_ratio = -1;
+
+ outfn_path_entry.set_text (_session->session_directory().export_path() + G_DIR_SEPARATOR +"export.avi");
+
+ // TODO remember setting for export-range.. somehow, (let explicit range override)
+ frameoffset_t av_offset = ARDOUR_UI::instance()->video_timeline->get_offset();
+ if (av_offset < 0 ) {
+ insnd_combo.append_text (_("from 00:00:00:00 to the video's end"));
+ } else {
+ insnd_combo.append_text (_("from the video's start to the video's end"));
+ }
+ if (!export_range.empty()) {
+ insnd_combo.append_text (_("Selected range")); // TODO show export_range.start() -> export_range.end_frame()
+ }
+ if (range) {
+ insnd_combo.set_active(2);
+ } else {
+ insnd_combo.set_active(0);
+ }
+
+ preset_combo.set_active(0);
+ audio_codec_combo.set_active(0);
+ video_codec_combo.set_active(0);
+ audio_bitrate_combo.set_active(0);
+ audio_samplerate_combo.set_active(2);
+ video_bitrate_combo.set_active(0);
+ aspect_combo.set_active(1);
+
+ scale_checkbox.set_active(false);
+ scale_aspect.set_active(true);
+ aspect_checkbox.set_active(false);
+ normalize_checkbox.set_active(false);
+ twopass_checkbox.set_active(false);
+ optimizations_checkbox.set_active(false);
+ deinterlace_checkbox.set_active(false);
+ bframes_checkbox.set_active(false);
+ fps_checkbox.set_active(false);
+ meta_checkbox.set_active(false);
+
+ float tcfps = _session->timecode_frames_per_second();
+
+ LocaleGuard lg;
+
+ XMLNode* node = _session->extra_xml (X_("Videotimeline"));
+ bool filenameset = false;
+ if (node) {
+ if (node->property(X_("OriginalVideoFile"))) {
+ std::string filename = node->property(X_("OriginalVideoFile"))->value();
+ if (Glib::file_test(filename, Glib::FILE_TEST_EXISTS)) {
+ invid_path_entry.set_text (filename);
+ filenameset = true;
+ }
+ }
+ if (!filenameset
+ && node->property(X_("Filename"))
+ && node->property(X_("LocalFile"))
+ && node->property(X_("LocalFile"))->value() == X_("1")
+ )
+ {
+ std::string filename = node->property(X_("Filename"))->value();
+ if (filename.at(0) != G_DIR_SEPARATOR)
+ {
+ filename = Glib::build_filename (_session->session_directory().video_path(), filename);
+ }
+ if (Glib::file_test(filename, Glib::FILE_TEST_EXISTS))
+ {
+ invid_path_entry.set_text (filename);
+ filenameset = true;
+ }
+ }
+ }
+ if (!filenameset) {
+ invid_path_entry.set_text (X_(""));
+ }
+
+ node = _session->extra_xml (X_("Videoexport"));
+ if (node) {
+ XMLProperty const * prop;
+ prop = node->property (X_("ChangeGeometry"));
+ if (prop) { scale_checkbox.set_active(atoi(prop->value())?true:false); }
+ prop = node->property (X_("KeepAspect"));
+ if (prop) { scale_aspect.set_active(atoi(prop->value())?true:false); }
+ prop = node->property (X_("ChangeAspect"));
+ if (prop) { aspect_checkbox.set_active(atoi(prop->value())?true:false); }
+ prop = node->property (X_("NormalizeAudio"));
+ if (prop) { normalize_checkbox.set_active(atoi(prop->value())?true:false); }
+ prop = node->property (X_("TwoPassEncode"));
+ if (prop) { twopass_checkbox.set_active(atoi(prop->value())?true:false); }
+ prop = node->property (X_("CodecOptimzations"));
+ if (prop) { optimizations_checkbox.set_active(atoi(prop->value())?true:false); }
+ prop = node->property (X_("Deinterlace"));
+ if (prop) { deinterlace_checkbox.set_active(atoi(prop->value())?true:false); }
+ prop = node->property (X_("BFrames"));
+ if (prop) { bframes_checkbox.set_active(atoi(prop->value())?true:false); }
+ prop = node->property (X_("ChangeFPS"));
+ if (prop) { fps_checkbox.set_active(atoi(prop->value())?true:false); }
+ prop = node->property (X_("Metadata"));
+ if (prop) { meta_checkbox.set_active(atoi(prop->value())?true:false); }
+
+ prop = node->property (X_("Format"));
+ if (prop && !prop->value().empty()) { change_file_extension( "." + prop->value()); }
+
+ _suspend_signals = true;
+ prop = node->property (X_("Width"));
+ if (prop) { width_spinner.set_value(atoi(prop->value())); }
+ prop = node->property (X_("Height"));
+ if (prop) { height_spinner.set_value(atoi(prop->value())); }
+ _suspend_signals = false;
+
+ prop = node->property (X_("FPS"));
+ if (prop && fps_checkbox.get_active()) { tcfps = atof(prop->value()); }
+
+ prop = node->property (X_("Preset"));
+ if (prop) { preset_combo.set_active_text(prop->value()); }
+ prop = node->property (X_("VCodec"));
+ if (prop) { video_codec_combo.set_active_text(prop->value()); }
+ prop = node->property (X_("ACodec"));
+ if (prop) { audio_codec_combo.set_active_text(prop->value()); }
+ prop = node->property (X_("VBitrate"));
+ if (prop) { video_bitrate_combo.set_active_text(prop->value()); }
+ prop = node->property (X_("ABitrate"));
+ if (prop) { audio_bitrate_combo.set_active_text(prop->value()); }
+ prop = node->property (X_("AspectRatio"));
+ if (prop) { aspect_combo.set_active_text(prop->value()); }
+ prop = node->property (X_("SampleRate"));
+ if (prop) { audio_samplerate_combo.set_active_text(prop->value()); }
+ }
+
+ if (fabs(tcfps - 23.976) < 0.01) { fps_combo.set_active(0); }
+ else if (fabs(tcfps - 24.0 ) < 0.01) { fps_combo.set_active(1); }
+ else if (fabs(tcfps - 24.976) < 0.01) { fps_combo.set_active(2); }
+ else if (fabs(tcfps - 25.0 ) < 0.01) { fps_combo.set_active(3); }
+ else if (fabs(tcfps - 29.97 ) < 0.01) { fps_combo.set_active(4); }
+ else if (fabs(tcfps - 30.0 ) < 0.01) { fps_combo.set_active(5); }
+ else if (fabs(tcfps - 59.94 ) < 0.01) { fps_combo.set_active(6); }
+ else if (fabs(tcfps - 60.0 ) < 0.01) { fps_combo.set_active(7); }
+ else { fps_combo.set_active(5); }
+
+ set_original_file_information();
+
+ /* update sensitivity */
+ scale_checkbox_toggled();
+ aspect_checkbox_toggled();
+ fps_checkbox_toggled();
+ video_codec_combo_changed();
+
+ _suspend_dirty = false;
+
+ show_all_children ();
+ if (progress_box) {
+ progress_box->hide();
+ }
+}
+
+XMLNode&
+ExportVideoDialog::get_state ()
+{
+ LocaleGuard lg;
+ XMLNode* node = new XMLNode (X_("Videoexport"));
+ node->add_property (X_("ChangeGeometry"), scale_checkbox.get_active() ? X_("1") : X_("0"));
+ node->add_property (X_("KeepAspect"), scale_aspect.get_active() ? X_("1") : X_("0"));
+ node->add_property (X_("ChangeAspect"), aspect_checkbox.get_active() ? X_("1") : X_("0"));
+ node->add_property (X_("NormalizeAudio"), normalize_checkbox.get_active() ? X_("1") : X_("0"));
+ node->add_property (X_("TwoPassEncode"), twopass_checkbox.get_active() ? X_("1") : X_("0"));
+ node->add_property (X_("CodecOptimzations"), optimizations_checkbox.get_active() ? X_("1") : X_("0"));
+ node->add_property (X_("Deinterlace"), deinterlace_checkbox.get_active() ? X_("1") : X_("0"));
+ node->add_property (X_("BFrames"), bframes_checkbox.get_active() ? X_("1") : X_("0"));
+ node->add_property (X_("ChangeFPS"), fps_checkbox.get_active() ? X_("1") : X_("0"));
+ node->add_property (X_("Metadata"), meta_checkbox.get_active() ? X_("1") : X_("0"));
+
+ node->add_property (X_("Format"), get_file_extension(outfn_path_entry.get_text()));
+
+ node->add_property (X_("Width"), width_spinner.get_value());
+ node->add_property (X_("Height"), height_spinner.get_value());
+
+ node->add_property (X_("Preset"), preset_combo.get_active_text());
+ node->add_property (X_("VCodec"), video_codec_combo.get_active_text());
+ node->add_property (X_("ACodec"), audio_codec_combo.get_active_text());
+ node->add_property (X_("VBitrate"), video_bitrate_combo.get_active_text());
+ node->add_property (X_("ABitrate"), audio_bitrate_combo.get_active_text());
+ node->add_property (X_("AspectRatio"), aspect_combo.get_active_text());
+ node->add_property (X_("SampleRate"), audio_samplerate_combo.get_active_text());
+ node->add_property (X_("FPS"), fps_combo.get_active_text());
+
+ return *node;
+}
+
+void
+ExportVideoDialog::set_state (const XMLNode &)
+{