From b19987ae5342602977b265ba9167ec09e433367c Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 9 May 2017 23:08:34 +0100 Subject: [PATCH] Some export tidying up. --- src/lib/encoder.cc | 2 +- src/lib/event_history.h | 5 +++++ src/lib/ffmpeg_transcoder.cc | 15 +++++++++------ src/lib/ffmpeg_transcoder.h | 17 ++++++++++++----- src/tools/dcpomatic.cc | 3 +-- src/wx/export_dialog.cc | 35 ++++++++++++++++++++++++++-------- src/wx/export_dialog.h | 2 ++ test/ffmpeg_transcoder_test.cc | 2 +- 8 files changed, 58 insertions(+), 23 deletions(-) diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc index e82c4af7e..2d916d47e 100644 --- a/src/lib/encoder.cc +++ b/src/lib/encoder.cc @@ -59,8 +59,8 @@ using dcp::Data; */ Encoder::Encoder (shared_ptr film, shared_ptr writer) : _film (film) - , _writer (writer) , _history (200) + , _writer (writer) { servers_list_changed (); } diff --git a/src/lib/event_history.h b/src/lib/event_history.h index 5b0f9a6a3..f723591fb 100644 --- a/src/lib/event_history.h +++ b/src/lib/event_history.h @@ -18,6 +18,9 @@ */ +#ifndef DCPOMATIC_EVENT_HISTORY_H +#define DCPOMATIC_EVENT_HISTORY_H + #include #include @@ -39,3 +42,5 @@ private: /** Number of events that we should keep history for */ int const _size; }; + +#endif diff --git a/src/lib/ffmpeg_transcoder.cc b/src/lib/ffmpeg_transcoder.cc index 19c55ff7a..b3d1e9926 100644 --- a/src/lib/ffmpeg_transcoder.cc +++ b/src/lib/ffmpeg_transcoder.cc @@ -43,21 +43,24 @@ force_pixel_format (AVPixelFormat, AVPixelFormat out) return out; } -FFmpegTranscoder::FFmpegTranscoder (shared_ptr film, weak_ptr job) +FFmpegTranscoder::FFmpegTranscoder (shared_ptr film, weak_ptr job, boost::filesystem::path output, Format format) : Transcoder (film, job) - , _pixel_format (AV_PIX_FMT_YUV422P10) , _history (1000) + , _output (output) { - + switch (format) { + case FORMAT_PRORES: + _pixel_format = AV_PIX_FMT_YUV422P10; + _codec_name = "prores_ks"; + } } void FFmpegTranscoder::go () { - string const codec_name = "prores_ks"; - AVCodec* codec = avcodec_find_encoder_by_name (codec_name.c_str()); + AVCodec* codec = avcodec_find_encoder_by_name (_codec_name.c_str()); if (!codec) { - throw runtime_error (String::compose ("could not find FFmpeg codec %1", codec_name)); + throw runtime_error (String::compose ("could not find FFmpeg codec %1", _codec_name)); } _codec_context = avcodec_alloc_context3 (codec); diff --git a/src/lib/ffmpeg_transcoder.h b/src/lib/ffmpeg_transcoder.h index 5380e84b0..9799285e2 100644 --- a/src/lib/ffmpeg_transcoder.h +++ b/src/lib/ffmpeg_transcoder.h @@ -18,6 +18,9 @@ */ +#ifndef DCPOMATIC_FFMPEG_TRANSCODER_H +#define DCPOMATIC_FFMPEG_TRANSCODER_H + #include "transcoder.h" #include "event_history.h" extern "C" { @@ -28,7 +31,12 @@ extern "C" { class FFmpegTranscoder : public Transcoder { public: - FFmpegTranscoder (boost::shared_ptr film, boost::weak_ptr job); + enum Format + { + FORMAT_PRORES + }; + + FFmpegTranscoder (boost::shared_ptr film, boost::weak_ptr job, boost::filesystem::path output, Format format); void go (); @@ -38,10 +46,6 @@ public: return false; } - void set_output (boost::filesystem::path o) { - _output = o; - } - private: void video (boost::shared_ptr, DCPTime); void audio (boost::shared_ptr, DCPTime); @@ -51,6 +55,7 @@ private: AVFormatContext* _format_context; AVStream* _video_stream; AVPixelFormat _pixel_format; + std::string _codec_name; mutable boost::mutex _mutex; DCPTime _last_time; @@ -59,3 +64,5 @@ private: boost::filesystem::path _output; }; + +#endif diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index ccaa44edb..c19336631 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -707,8 +707,7 @@ private: ExportDialog* d = new ExportDialog (this); if (d->ShowModal() == wxID_OK) { shared_ptr job (new TranscodeJob (_film)); - shared_ptr tx (new FFmpegTranscoder (_film, job)); - tx->set_output (d->path ()); + shared_ptr tx (new FFmpegTranscoder (_film, job, d->path(), d->format())); job->set_transcoder (tx); JobManager::instance()->add (job); } diff --git a/src/wx/export_dialog.cc b/src/wx/export_dialog.cc index e21a49e8a..fb50e1134 100644 --- a/src/wx/export_dialog.cc +++ b/src/wx/export_dialog.cc @@ -25,6 +25,20 @@ using boost::bind; +#define FORMATS 1 + +wxString format_names[] = { + _("ProRes"), +}; + +wxString format_filters[] = { + _("MOV files (*.mov)|*.mov"), +}; + +FFmpegTranscoder::Format formats[] = { + FFmpegTranscoder::FORMAT_PRORES, +}; + ExportDialog::ExportDialog (wxWindow* parent) : TableDialog (parent, _("Export film"), 2, 1, true) { @@ -32,10 +46,12 @@ ExportDialog::ExportDialog (wxWindow* parent) _format = new wxChoice (this, wxID_ANY); add (_format); add (_("Output file"), true); - _file = new FilePickerCtrl (this, _("Select output file"), _("MOV files (*.mov)|*.mov"), false); + _file = new FilePickerCtrl (this, _("Select output file"), format_filters[0], false); add (_file); - _format->Append (_("ProRes 422")); + for (int i = 0; i < FORMATS; ++i) { + _format->Append (format_names[i]); + } _format->SetSelection (0); _format->Bind (wxEVT_CHOICE, bind (&ExportDialog::format_changed, this)); @@ -46,12 +62,8 @@ ExportDialog::ExportDialog (wxWindow* parent) void ExportDialog::format_changed () { - switch (_format->GetSelection()) { - case 0: - _file->SetWildcard (_("MOV files (*.mov)")); - break; - } - + DCPOMATIC_ASSERT (_format->GetSelection() >= 0 && _format->GetSelection() < FORMATS); + _file->SetWildcard (format_filters[_format->GetSelection()]); _file->SetPath (""); } @@ -60,3 +72,10 @@ ExportDialog::path () const { return wx_to_std (_file->GetPath ()); } + +FFmpegTranscoder::Format +ExportDialog::format () const +{ + DCPOMATIC_ASSERT (_format->GetSelection() >= 0 && _format->GetSelection() < FORMATS); + return formats[_format->GetSelection()]; +} diff --git a/src/wx/export_dialog.h b/src/wx/export_dialog.h index 8f0be7194..04a516bca 100644 --- a/src/wx/export_dialog.h +++ b/src/wx/export_dialog.h @@ -19,6 +19,7 @@ */ #include "table_dialog.h" +#include "lib/ffmpeg_transcoder.h" #include #include @@ -30,6 +31,7 @@ public: ExportDialog (wxWindow* parent); boost::filesystem::path path () const; + FFmpegTranscoder::Format format () const; private: void format_changed (); diff --git a/test/ffmpeg_transcoder_test.cc b/test/ffmpeg_transcoder_test.cc index c97287cb7..bf4f991f8 100644 --- a/test/ffmpeg_transcoder_test.cc +++ b/test/ffmpeg_transcoder_test.cc @@ -40,6 +40,6 @@ BOOST_AUTO_TEST_CASE (ffmpeg_transcoder_basic_test) wait_for_jobs (); shared_ptr job (new TranscodeJob (film)); - FFmpegTranscoder transcoder (film, job); + FFmpegTranscoder transcoder (film, job, "build/test/ffmpeg_transcoder_basic_test/test.mov", FFmpegTranscoder::FORMAT_PRORES); transcoder.go (); } -- 2.30.2