summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-05-08 20:37:53 +0100
committerCarl Hetherington <cth@carlh.net>2013-05-08 20:37:53 +0100
commitfd040c2bd27fde35424a384174ecb56c643764cd (patch)
tree074906414d27d93a21224f110129a7e857a6ee04 /src
parent72d36df1174810d8d871a06d085b81b1652edf67 (diff)
Some tidying up. Do encode progress in the writer to improve progress bar movement with still-image DCPs (#130).
Diffstat (limited to 'src')
-rw-r--r--src/lib/ab_transcoder.cc41
-rw-r--r--src/lib/ab_transcoder.h2
-rw-r--r--src/lib/encoder.cc5
-rw-r--r--src/lib/encoder.h8
-rw-r--r--src/lib/player.cc12
-rw-r--r--src/lib/player.h1
-rw-r--r--src/lib/transcoder.cc11
-rw-r--r--src/lib/transcoder.h4
-rw-r--r--src/lib/writer.cc8
-rw-r--r--src/lib/writer.h4
10 files changed, 38 insertions, 58 deletions
diff --git a/src/lib/ab_transcoder.cc b/src/lib/ab_transcoder.cc
index 2e0d41e7d..f75491dce 100644
--- a/src/lib/ab_transcoder.cc
+++ b/src/lib/ab_transcoder.cc
@@ -47,27 +47,25 @@ using boost::dynamic_pointer_cast;
* @param e Encoder to use.
*/
-ABTranscoder::ABTranscoder (shared_ptr<Film> a, shared_ptr<Film> b, shared_ptr<Job> j)
- : _film_a (a)
- , _film_b (b)
- , _player_a (_film_a->player ())
- , _player_b (_film_b->player ())
+ABTranscoder::ABTranscoder (shared_ptr<Film> film_a, shared_ptr<Film> film_b, shared_ptr<Job> j)
+ : _player_a (film_a->player ())
+ , _player_b (film_b->player ())
, _job (j)
- , _encoder (new Encoder (_film_a))
- , _combiner (new Combiner (a->log()))
+ , _encoder (new Encoder (film_a, j))
+ , _combiner (new Combiner (film_a->log()))
{
- _matcher.reset (new Matcher (_film_a->log(), _film_a->audio_frame_rate(), _film_a->video_frame_rate()));
- _delay_line.reset (new DelayLine (_film_a->log(), _film_a->audio_delay() * _film_a->audio_frame_rate() / 1000));
- _gain.reset (new Gain (_film_a->log(), _film_a->audio_gain()));
+ _matcher.reset (new Matcher (film_a->log(), film_a->audio_frame_rate(), film_a->video_frame_rate()));
+ _delay_line.reset (new DelayLine (film_a->log(), film_a->audio_delay() * film_a->audio_frame_rate() / 1000));
+ _gain.reset (new Gain (film_a->log(), film_a->audio_gain()));
_player_a->Video.connect (bind (&Combiner::process_video, _combiner, _1, _2, _3, _4));
_player_b->Video.connect (bind (&Combiner::process_video_b, _combiner, _1, _2, _3, _4));
- int const trim_start = _film_a->trim_type() == Film::ENCODE ? _film_a->trim_start() : 0;
- int const trim_end = _film_a->trim_type() == Film::ENCODE ? _film_a->trim_end() : 0;
+ int const trim_start = film_a->trim_type() == Film::ENCODE ? film_a->trim_start() : 0;
+ int const trim_end = film_a->trim_type() == Film::ENCODE ? film_a->trim_end() : 0;
_trimmer.reset (new Trimmer (
- _film_a->log(), trim_start, trim_end, _film_a->content_length(),
- _film_a->audio_frame_rate(), _film_a->video_frame_rate(), _film_a->dcp_frame_rate()
+ film_a->log(), trim_start, trim_end, film_a->content_length(),
+ film_a->audio_frame_rate(), film_a->video_frame_rate(), film_a->dcp_frame_rate()
));
@@ -88,20 +86,7 @@ ABTranscoder::go ()
{
_encoder->process_begin ();
- bool done[2] = { false, false };
-
- while (1) {
- done[0] = _player_a->pass ();
- done[1] = _player_b->pass ();
-
- if (_job) {
- _player_a->set_progress (_job);
- }
-
- if (done[0] && done[1]) {
- break;
- }
- }
+ while (!_player_a->pass () || !_player_b->pass ()) {}
_delay_line->process_end ();
_matcher->process_end ();
diff --git a/src/lib/ab_transcoder.h b/src/lib/ab_transcoder.h
index 1fef66b88..134bce3e4 100644
--- a/src/lib/ab_transcoder.h
+++ b/src/lib/ab_transcoder.h
@@ -54,8 +54,6 @@ public:
void go ();
private:
- boost::shared_ptr<Film> _film_a;
- boost::shared_ptr<Film> _film_b;
boost::shared_ptr<Player> _player_a;
boost::shared_ptr<Player> _player_b;
boost::shared_ptr<Job> _job;
diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc
index c1d1041ae..d25e0d0f8 100644
--- a/src/lib/encoder.cc
+++ b/src/lib/encoder.cc
@@ -55,8 +55,9 @@ using boost::optional;
int const Encoder::_history_size = 25;
/** @param f Film that we are encoding */
-Encoder::Encoder (shared_ptr<Film> f)
+Encoder::Encoder (shared_ptr<Film> f, shared_ptr<Job> j)
: _film (f)
+ , _job (j)
, _video_frames_in (0)
, _video_frames_out (0)
#ifdef HAVE_SWRESAMPLE
@@ -127,7 +128,7 @@ Encoder::process_begin ()
}
}
- _writer.reset (new Writer (_film));
+ _writer.reset (new Writer (_film, _job));
}
diff --git a/src/lib/encoder.h b/src/lib/encoder.h
index f95d42661..6cf5540c5 100644
--- a/src/lib/encoder.h
+++ b/src/lib/encoder.h
@@ -51,6 +51,7 @@ class ServerDescription;
class DCPVideoFrame;
class EncodedData;
class Writer;
+class Job;
/** @class Encoder
* @brief Encoder to J2K and WAV for DCP.
@@ -62,11 +63,11 @@ class Writer;
class Encoder : public VideoSink, public AudioSink
{
public:
- Encoder (boost::shared_ptr<Film> f);
+ Encoder (boost::shared_ptr<Film> f, boost::shared_ptr<Job>);
virtual ~Encoder ();
/** Called to indicate that a processing run is about to begin */
- virtual void process_begin ();
+ void process_begin ();
/** Call with a frame of video.
* @param i Video frame image.
@@ -79,7 +80,7 @@ public:
void process_audio (boost::shared_ptr<const AudioBuffers>);
/** Called when a processing run has finished */
- virtual void process_end ();
+ void process_end ();
float current_encoding_rate () const;
int video_frames_out () const;
@@ -93,6 +94,7 @@ private:
/** Film that we are encoding */
boost::shared_ptr<Film> _film;
+ boost::shared_ptr<Job> _job;
/** Mutex for _time_history and _last_frame */
mutable boost::mutex _history_mutex;
diff --git a/src/lib/player.cc b/src/lib/player.cc
index 68a962cdd..95036cfe0 100644
--- a/src/lib/player.cc
+++ b/src/lib/player.cc
@@ -122,18 +122,6 @@ Player::pass ()
}
void
-Player::set_progress (shared_ptr<Job> job)
-{
- /* Assume progress can be divined from how far through the video we are */
-
- if (_video_decoder >= _video_decoders.size() || !_playlist->video_length()) {
- return;
- }
-
- job->set_progress ((_video_start[_video_decoder] + _video_decoders[_video_decoder]->video_frame()) / _playlist->video_length ());
-}
-
-void
Player::process_video (shared_ptr<const Image> i, bool same, shared_ptr<Subtitle> s, double t)
{
Video (i, same, s, _video_start[_video_decoder] + t);
diff --git a/src/lib/player.h b/src/lib/player.h
index 20b83bfdb..b6fb41f6e 100644
--- a/src/lib/player.h
+++ b/src/lib/player.h
@@ -49,7 +49,6 @@ public:
void disable_subtitles ();
bool pass ();
- void set_progress (boost::shared_ptr<Job>);
bool seek (double);
void seek_back ();
void seek_forward ();
diff --git a/src/lib/transcoder.cc b/src/lib/transcoder.cc
index 2e33931bd..f8fe0c8d5 100644
--- a/src/lib/transcoder.cc
+++ b/src/lib/transcoder.cc
@@ -36,6 +36,7 @@
#include "audio_decoder.h"
#include "player.h"
#include "trimmer.h"
+#include "job.h"
using std::string;
using boost::shared_ptr;
@@ -49,7 +50,7 @@ using boost::dynamic_pointer_cast;
Transcoder::Transcoder (shared_ptr<Film> f, shared_ptr<Job> j)
: _job (j)
, _player (f->player ())
- , _encoder (new Encoder (f))
+ , _encoder (new Encoder (f, j))
{
_matcher.reset (new Matcher (f->log(), f->audio_frame_rate(), f->video_frame_rate()));
_delay_line.reset (new DelayLine (f->log(), f->audio_delay() * f->audio_frame_rate() / 1000));
@@ -82,13 +83,9 @@ void
Transcoder::go ()
{
_encoder->process_begin ();
- while (1) {
- if (_player->pass ()) {
- break;
- }
- _player->set_progress (_job);
- }
+ while (!_player->pass ()) {}
+
_delay_line->process_end ();
if (_matcher) {
_matcher->process_end ();
diff --git a/src/lib/transcoder.h b/src/lib/transcoder.h
index 97ecaabfc..48b453fe4 100644
--- a/src/lib/transcoder.h
+++ b/src/lib/transcoder.h
@@ -17,6 +17,8 @@
*/
+#include "types.h"
+
/** @file src/transcoder.h
*
* A decoder is selected according to the content type, and the encoder can be specified
@@ -51,7 +53,7 @@ public:
float current_encoding_rate () const;
int video_frames_out () const;
-protected:
+private:
/** A Job that is running this Transcoder, or 0 */
boost::shared_ptr<Job> _job;
boost::shared_ptr<Player> _player;
diff --git a/src/lib/writer.cc b/src/lib/writer.cc
index b545848cb..c7d2cf8b4 100644
--- a/src/lib/writer.cc
+++ b/src/lib/writer.cc
@@ -34,6 +34,7 @@
#include "player.h"
#include "audio_mapping.h"
#include "config.h"
+#include "job.h"
#include "i18n.h"
@@ -47,8 +48,9 @@ using boost::shared_ptr;
int const Writer::_maximum_frames_in_memory = 8;
-Writer::Writer (shared_ptr<Film> f)
+Writer::Writer (shared_ptr<Film> f, shared_ptr<Job> j)
: _film (f)
+ , _job (j)
, _first_nonexistant_frame (0)
, _thread (0)
, _finish (false)
@@ -202,6 +204,10 @@ try
}
}
lock.lock ();
+
+ if (_film->video_length ()) {
+ _job->set_progress (float(_full_written + _fake_written + _repeat_written) / _film->video_length());
+ }
++_last_written_frame;
}
diff --git a/src/lib/writer.h b/src/lib/writer.h
index beb16c7b9..62714edf3 100644
--- a/src/lib/writer.h
+++ b/src/lib/writer.h
@@ -26,6 +26,7 @@
class Film;
class EncodedData;
class AudioBuffers;
+class Job;
namespace libdcp {
class MonoPictureAsset;
@@ -63,7 +64,7 @@ bool operator== (QueueItem const & a, QueueItem const & b);
class Writer : public ExceptionStore
{
public:
- Writer (boost::shared_ptr<Film>);
+ Writer (boost::shared_ptr<Film>, boost::shared_ptr<Job>);
bool can_fake_write (int) const;
@@ -80,6 +81,7 @@ private:
/** our Film */
boost::shared_ptr<Film> _film;
+ boost::shared_ptr<Job> _job;
/** the first frame index that does not already exist in our MXF */
int _first_nonexistant_frame;