X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fexamine_content_job.cc;h=93333605b8e6a6983fc63fd668f420bd426fae35;hb=e9d0d7bf9871b7e7fa8d154535cf0bbc7e7bd466;hp=e71ab361aecf623090012aabc5969e1fedebdb5f;hpb=ac712b45bad948fc8f38cf4fa48a529f2024c7f5;p=dcpomatic.git diff --git a/src/lib/examine_content_job.cc b/src/lib/examine_content_job.cc index e71ab361a..93333605b 100644 --- a/src/lib/examine_content_job.cc +++ b/src/lib/examine_content_job.cc @@ -30,9 +30,11 @@ #include "transcoder.h" #include "log.h" #include "film.h" +#include "video_decoder.h" using std::string; using std::vector; +using std::pair; using boost::shared_ptr; ExamineContentJob::ExamineContentJob (shared_ptr f, shared_ptr req) @@ -58,41 +60,78 @@ ExamineContentJob::name () const void ExamineContentJob::run () { - /* Decode the content to get an accurate length */ - - shared_ptr o (new Options ("", "", "")); - o->out_size = Size (512, 512); - o->apply_crop = false; - - descend (0.5); - - _decoder = decoder_factory (_film, o, this); - _decoder->go (); + float progress_remaining = 1; - _film->set_length (_decoder->video_frame_index()); + /* Set the film's length to either + a) a length judged by running through the content or + b) the length from a decoder's header. + */ - _film->log()->log (String::compose ("Video length is %1 frames", _decoder->video_frame_index())); + if (!_film->trust_content_header()) { + /* Decode the content to get an accurate length */ + + /* We don't want to use any existing length here, as progress + will be messed up. + */ + _film->unset_length (); + + shared_ptr o (new Options ("", "", "")); + o->out_size = Size (512, 512); + o->apply_crop = false; + o->decode_audio = false; + + descend (0.5); + + pair, shared_ptr > decoders = decoder_factory (_film, o, this); + + set_progress_unknown (); + while (!decoders.first->pass()) { + /* keep going */ + } + + _film->set_length (decoders.first->video_frame()); + + _film->log()->log (String::compose ("Video length examined as %1 frames", _film->length().get())); + + ascend (); + + progress_remaining -= 0.5; + + } else { - ascend (); + /* Get a quick decoder to get the content's length from its header. + It would have been nice to just use the thumbnail transcoder's decoder, + but that's a bit fiddly, and this isn't too expensive. + */ + + shared_ptr o (new Options ("", "", "")); + o->out_size = Size (1024, 1024); + pair, shared_ptr > d = decoder_factory (_film, o, 0); + _film->set_length (d.first->length()); + + _film->log()->log (String::compose ("Video length obtained from header as %1 frames", _film->length().get())); + } /* Now make thumbnails for it */ - descend (0.5); + descend (progress_remaining); try { - o.reset (new Options (_film->dir ("thumbs"), ".png", "")); + shared_ptr o (new Options (_film->dir ("thumbs"), ".png", "")); o->out_size = _film->size (); o->apply_crop = false; o->decode_audio = false; - if (_film->length() > 0) { - o->decode_video_skip = _film->length().get() / 128; - } else { - o->decode_video_skip = 0; - } + o->decode_video_skip = _film->length().get() / 128; o->decode_subtitles = true; shared_ptr e (new ImageMagickEncoder (_film, o)); Transcoder w (_film, o, this, e); w.go (); + + /* Now set the film's length from the transcoder's decoder, since we + went to all the trouble of going through the content. + */ + + _film->set_length (w.video_decoder()->video_frame()); } catch (std::exception& e) {