X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fexamine_content_job.cc;h=f0fb29812ffc99bf012a116e6216fa97ec0febae;hb=44b57d623dec97a3f9955082f0b8a7a8d27b7518;hp=d77ede2f91abf1d1c0d0d9348ed19247429a3272;hpb=5d48e36440d6b4ebf4c04a413bd340b214ba8c42;p=dcpomatic.git diff --git a/src/lib/examine_content_job.cc b/src/lib/examine_content_job.cc index d77ede2f9..f0fb29812 100644 --- a/src/lib/examine_content_job.cc +++ b/src/lib/examine_content_job.cc @@ -26,12 +26,15 @@ #include "film_state.h" #include "decoder_factory.h" #include "decoder.h" +#include "imagemagick_encoder.h" +#include "transcoder.h" +#include "log.h" using namespace std; using namespace boost; -ExamineContentJob::ExamineContentJob (shared_ptr fs, Log* l) - : Job (fs, shared_ptr (), l) +ExamineContentJob::ExamineContentJob (shared_ptr fs, Log* l, shared_ptr req) + : Job (fs, l, req) { } @@ -43,19 +46,61 @@ ExamineContentJob::~ExamineContentJob () string ExamineContentJob::name () const { - return String::compose ("Examine content of %1", _fs->name); + if (_fs->name().empty ()) { + return "Examine content"; + } + + return String::compose ("Examine content of %1", _fs->name()); } void ExamineContentJob::run () { + shared_ptr fs = _fs->state_copy (); + + /* Decode the content to get an accurate length */ + shared_ptr o (new Options ("", "", "")); o->out_size = Size (512, 512); o->apply_crop = false; - _decoder = decoder_factory (_fs, o, this, _log, true, true); + descend (0.5); + + _decoder = decoder_factory (fs, o, this, _log, true, true); _decoder->go (); - + + fs->set_length (_decoder->last_video_frame ()); + + _log->log (String::compose ("Video length is %1 frames", _decoder->last_video_frame())); + + ascend (); + + /* Now make thumbnails for it */ + + descend (0.5); + + try { + o.reset (new Options (fs->dir ("thumbs"), ".png", "")); + o->out_size = fs->size (); + o->apply_crop = false; + o->decode_audio = false; + o->decode_video_frequency = 128; + o->decode_subtitles = true; + shared_ptr e (new ImageMagickEncoder (fs, o, _log)); + Transcoder w (fs, o, this, _log, e); + w.go (); + + } catch (std::exception& e) { + + ascend (); + set_progress (1); + set_error (e.what ()); + set_state (FINISHED_ERROR); + return; + + } + + ascend (); set_progress (1); set_state (FINISHED_OK); }