#include <fcntl.h>
#include <sigc++/bind.h>
-#include <libgen.h>
+
+#include <glib/gstdio.h>
#include "pbd/error.h"
#include "pbd/convert.h"
#include "ardour/session_metadata.h"
#include "ardour/broadcast_info.h"
-#include "utils.h"
#include "opts.h"
#include "export_video_dialog.h"
#include "utils_videotl.h"
using namespace ARDOUR;
using namespace VideoUtils;
-ExportVideoDialog::ExportVideoDialog (PublicEditor& ed, Session* s)
+ExportVideoDialog::ExportVideoDialog (Session* s, TimeSelection &tme, bool range)
: ArdourDialog (_("Export Video File "))
- , editor (ed)
+ , export_range (tme)
, outfn_path_label (_("File:"), Gtk::ALIGN_LEFT)
, outfn_browse_button (_("Browse"))
, invid_path_label (_("Video:"), Gtk::ALIGN_LEFT)
} else {
insnd_combo.append_text (_("from the video's start to the video's end"));
}
- insnd_combo.set_active(0);
+ 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);
+ }
outfn_path_entry.set_width_chars(38);
outfn_path_entry.set_text (_session->session_directory().export_path() + G_DIR_SEPARATOR +"export.avi");
filenameset = true;
}
}
- else if (!filenameset
+ if (!filenameset
&& node->property(X_("Filename"))
&& node->property(X_("LocalFile"))
&& node->property(X_("LocalFile"))->value() == X_("1")
filenameset = true;
}
}
+ if (!filenameset) {
+ invid_path_entry.set_text (X_(""));
+ }
}
l = manage (new Label (_("<b>Settings:</b>"), Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false));
video_codec_combo.append_text("mjpeg");
video_codec_combo.append_text("mpeg2video");
video_codec_combo.append_text("mpeg4");
- video_codec_combo.append_text("x264 (baseline)");
- video_codec_combo.append_text("x264 (hq)");
+ video_codec_combo.append_text("h264");
video_codec_combo.append_text("vpx (webm)");
video_codec_combo.append_text("copy");
video_codec_combo.set_active(4);
ExportVideoDialog::finished ()
{
if (aborted) {
- unlink(outfn_path_entry.get_text().c_str());
- unlink (insnd.c_str());
+ ::g_unlink(outfn_path_entry.get_text().c_str());
+ ::g_unlink (insnd.c_str());
Gtk::Dialog::response(RESPONSE_CANCEL);
} else if (twopass && firstpass) {
firstpass = false;
if (twopass_checkbox.get_active()) {
std::string outfn = outfn_path_entry.get_text();
std::string p2log = Glib::path_get_dirname (outfn) + G_DIR_SEPARATOR + "ffmpeg2pass";
- unlink (p2log.c_str());
+ ::g_unlink (p2log.c_str());
}
- unlink (insnd.c_str());
+ ::g_unlink (insnd.c_str());
Gtk::Dialog::response(RESPONSE_ACCEPT);
}
}
}
end += av_offset;
}
+ else if (insnd_combo.get_active_row_number() == 2) {
+ start = ARDOUR_UI::instance()->video_timeline->quantify_frames_to_apv(export_range.start());
+ end = ARDOUR_UI::instance()->video_timeline->quantify_frames_to_apv(export_range.end_frame());
+ }
if (end <= 0) {
start = _session->current_start_frame();
end = _session->current_end_frame();
printf("audio export-range %lld -> %lld\n", start, end);
#endif
+ const frameoffset_t vstart = ARDOUR_UI::instance()->video_timeline->get_offset();
+ const frameoffset_t vend = vstart + ARDOUR_UI::instance()->video_timeline->get_duration();
+
+ if ( (start >= end) || (end < vstart) || (start > vend)) {
+ warning << _("Export Video: export-range does not include video.") << endmsg;
+ Gtk::Dialog::response(RESPONSE_CANCEL);
+ return;
+ }
+
tsp->set_range (start, end);
tsp->set_name ("mysession");
tsp->set_range_id ("session");
insnd = fnp->get_path(fmp);
/* do sound export */
+ fmp->set_soundcloud_upload(false);
_session->get_export_handler()->add_export_config (tsp, ccp, fmp, fnp, b);
_session->get_export_handler()->do_export();
status = _session->get_export_status ();
if (gtk_events_pending()) {
gtk_main_iteration ();
} else {
- usleep (10000);
+ Glib::usleep (10000);
}
}
audio_progress_connection.disconnect();
status->finish ();
if (status->aborted()) {
- unlink (insnd.c_str());
+ ::g_unlink (insnd.c_str());
Gtk::Dialog::response(RESPONSE_CANCEL);
return;
}
transcoder = new TranscodeFfmpeg(invid);
if (!transcoder->ffexec_ok()) {
/* ffmpeg binary was not found. TranscodeFfmpeg prints a warning */
- unlink (insnd.c_str());
+ ::g_unlink (insnd.c_str());
Gtk::Dialog::response(RESPONSE_CANCEL);
return;
}
if (!transcoder->probe_ok()) {
/* video input file can not be read */
warning << _("Export Video: Video input file cannot be read.") << endmsg;
- unlink (insnd.c_str());
+ ::g_unlink (insnd.c_str());
Gtk::Dialog::response(RESPONSE_CANCEL);
return;
}
ffs.clear();
if (fps_checkbox.get_active()) {
- ffs["-r"] = fps_combo.get_active_text();
+ ffs["-r"] = fps_combo.get_active_text();
+ transcoder->set_fps(atof(fps_combo.get_active_text()));
}
if (scale_checkbox.get_active()) {
ffs["-strict"] = "-2";
}
- if (video_codec_combo.get_active_text() == "x264 (hq)" ) {
- ffs["-vcodec"] = "libx264";
- ffs["-vprofile"] = "high";
- }
- else if (video_codec_combo.get_active_text() == "x264 (baseline)" ) {
+ if (video_codec_combo.get_active_text() == "h264" ) {
ffs["-vcodec"] = "libx264";
- ffs["-vpre"] = "baseline";
}
else if (video_codec_combo.get_active_text() == "vpx (webm)" ) {
ffs["-vcodec"] = "libvpx";
ffs["-an"] = "-y";
ffs["-passlogfile"] = Glib::path_get_dirname (outfn) + G_DIR_SEPARATOR + "ffmpeg2pass";
ffs["-f"] = get_file_extension(invid).empty()?"mov":get_file_extension(invid);
-#ifdef _OS_WIN32
+#ifdef PLATFORM_WINDOWS
outfn = "NUL";
#else
outfn = "/dev/null";
double duration_s = 0;
if (insnd_combo.get_active_row_number() == 0) {
+ /* session start to session end */
framecnt_t duration_f = _session->current_end_frame() - _session->current_start_frame();
duration_s = (double)duration_f / (double)_session->nominal_frame_rate();
+ } else if (insnd_combo.get_active_row_number() == 2) {
+ /* selected range */
+ duration_s = export_range.length() / (double)_session->nominal_frame_rate();
} else {
+ /* video start to end */
framecnt_t duration_f = ARDOUR_UI::instance()->video_timeline->get_duration();
if (av_offset < 0 ) {
duration_f += av_offset;
std::ostringstream osstream; osstream << duration_s;
ffs["-t"] = osstream.str();
- if (fps_checkbox.get_active()) {
- transcoder->set_duration(duration_s * atof(fps_combo.get_active_text()));
- } else {
- transcoder->set_duration(duration_s * transcoder->get_fps());
- }
+ transcoder->set_duration(duration_s * transcoder->get_fps());
- if (insnd_combo.get_active_row_number() == 0) {
- const framepos_t start = _session->current_start_frame();
- const framepos_t snend = _session->current_end_frame();
+ if (insnd_combo.get_active_row_number() == 0 || insnd_combo.get_active_row_number() == 2) {
+ framepos_t start, snend;
const frameoffset_t vid_duration = ARDOUR_UI::instance()->video_timeline->get_duration();
+ if (insnd_combo.get_active_row_number() == 0) {
+ start = _session->current_start_frame();
+ snend = _session->current_end_frame();
+ } else {
+ start = export_range.start();
+ snend = export_range.end_frame();
+ }
#if 0 /* DEBUG */
printf("AV offset: %lld Vid-len: %lld Vid-end: %lld || start:%lld || end:%lld\n",
} else if (av_offset + vid_duration < snend) {
transcoder->set_leadinout(0, (snend - (av_offset + vid_duration)) / (double)_session->nominal_frame_rate());
transcoder->set_avoffset((av_offset - start) / (double)_session->nominal_frame_rate());
- } else {
+ }
+#if 0
+ else if (start > av_offset) {
+ std::ostringstream osstream; osstream << ((start - av_offset) / (double)_session->nominal_frame_rate());
+ ffs["-ss"] = osstream.str();
+ }
+#endif
+ else {
transcoder->set_avoffset((av_offset - start) / (double)_session->nominal_frame_rate());
}
+
} else if (av_offset < 0) {
/* from 00:00:00:00 to video-end */
transcoder->set_avoffset(av_offset / (double)_session->nominal_frame_rate());