, _job (j)
, _encoder (e)
{
- _da = decoder_factory (_film_a, o, j);
- _db = decoder_factory (_film_b, o, j);
+ _da = decoder_factory (_film_a, o);
+ _db = decoder_factory (_film_b, o);
if (_film_a->audio_stream()) {
shared_ptr<AudioStream> st = _film_a->audio_stream();
bool const vb = _db.video->pass ();
bool const a = _da.audio->pass ();
- _da.video->set_progress ();
+ if (_job) {
+ _da.video->set_progress (_job);
+ }
if (va && vb && a) {
break;
using boost::optional;
using boost::shared_ptr;
-AudioDecoder::AudioDecoder (shared_ptr<Film> f, DecodeOptions o, Job* j)
- : Decoder (f, o, j)
+AudioDecoder::AudioDecoder (shared_ptr<Film> f, DecodeOptions o)
+ : Decoder (f, o)
{
}
class AudioDecoder : public AudioSource, public virtual Decoder
{
public:
- AudioDecoder (boost::shared_ptr<Film>, DecodeOptions, Job *);
+ AudioDecoder (boost::shared_ptr<Film>, DecodeOptions);
virtual void set_audio_stream (boost::shared_ptr<AudioStream>);
#include <boost/lexical_cast.hpp>
#include "film.h"
#include "format.h"
-#include "job.h"
#include "options.h"
#include "exceptions.h"
#include "image.h"
/** @param f Film.
* @param o Decode options.
- * @param j Job that we are running within, or 0
*/
-Decoder::Decoder (boost::shared_ptr<Film> f, DecodeOptions o, Job* j)
+Decoder::Decoder (boost::shared_ptr<Film> f, DecodeOptions o)
: _film (f)
, _opt (o)
- , _job (j)
{
_film_connection = f->Changed.connect (bind (&Decoder::film_changed, this, _1));
}
#include "film.h"
#include "options.h"
-class Job;
class Image;
class Log;
class DelayLine;
class Decoder
{
public:
- Decoder (boost::shared_ptr<Film>, DecodeOptions, Job *);
+ Decoder (boost::shared_ptr<Film>, DecodeOptions);
virtual ~Decoder () {}
virtual bool pass () = 0;
boost::shared_ptr<Film> _film;
/** our decode options */
DecodeOptions _opt;
- /** associated Job, or 0 */
- Job* _job;
private:
virtual void film_changed (Film::Property) {}
Decoders
decoder_factory (
- shared_ptr<Film> f, DecodeOptions o, Job* j
+ shared_ptr<Film> f, DecodeOptions o
)
{
if (boost::filesystem::is_directory (f->content_path()) || f->content_type() == STILL) {
/* A single image file, or a directory of them */
return Decoders (
- shared_ptr<VideoDecoder> (new ImageMagickDecoder (f, o, j)),
- shared_ptr<AudioDecoder> (new ExternalAudioDecoder (f, o, j))
+ shared_ptr<VideoDecoder> (new ImageMagickDecoder (f, o)),
+ shared_ptr<AudioDecoder> (new ExternalAudioDecoder (f, o))
);
}
- shared_ptr<FFmpegDecoder> fd (new FFmpegDecoder (f, o, j));
+ shared_ptr<FFmpegDecoder> fd (new FFmpegDecoder (f, o));
if (f->use_content_audio()) {
return Decoders (fd, fd);
}
- return Decoders (fd, shared_ptr<AudioDecoder> (new ExternalAudioDecoder (f, o, j)));
+ return Decoders (fd, shared_ptr<AudioDecoder> (new ExternalAudioDecoder (f, o)));
}
#include "options.h"
class Film;
-class Job;
class VideoDecoder;
class AudioDecoder;
};
extern Decoders decoder_factory (
- boost::shared_ptr<Film>, DecodeOptions, Job *
+ boost::shared_ptr<Film>, DecodeOptions
);
#endif
DecodeOptions o;
o.decode_audio = false;
- Decoders decoders = decoder_factory (_film, o, this);
+ Decoders decoders = decoder_factory (_film, o);
set_progress_unknown ();
while (!decoders.video->pass()) {
/* Get a quick decoder to get the content's length from its header */
- Decoders d = decoder_factory (_film, DecodeOptions(), 0);
+ Decoders d = decoder_factory (_film, DecodeOptions());
_film->set_length (d.video->length());
_film->log()->log (String::compose ("Video length obtained from header as %1 frames", _film->length().get()));
using boost::shared_ptr;
using boost::optional;
-ExternalAudioDecoder::ExternalAudioDecoder (shared_ptr<Film> f, DecodeOptions o, Job* j)
- : Decoder (f, o, j)
- , AudioDecoder (f, o, j)
+ExternalAudioDecoder::ExternalAudioDecoder (shared_ptr<Film> f, DecodeOptions o)
+ : Decoder (f, o)
+ , AudioDecoder (f, o)
{
sf_count_t frames;
vector<SNDFILE*> sf = open_files (frames);
class ExternalAudioDecoder : public AudioDecoder
{
public:
- ExternalAudioDecoder (boost::shared_ptr<Film>, DecodeOptions, Job *);
+ ExternalAudioDecoder (boost::shared_ptr<Film>, DecodeOptions);
bool pass ();
using boost::dynamic_pointer_cast;
using libdcp::Size;
-FFmpegDecoder::FFmpegDecoder (shared_ptr<Film> f, DecodeOptions o, Job* j)
- : Decoder (f, o, j)
- , VideoDecoder (f, o, j)
- , AudioDecoder (f, o, j)
+FFmpegDecoder::FFmpegDecoder (shared_ptr<Film> f, DecodeOptions o)
+ : Decoder (f, o)
+ , VideoDecoder (f, o)
+ , AudioDecoder (f, o)
, _format_context (0)
, _video_stream (-1)
, _frame (0)
class FFmpegDecoder : public VideoDecoder, public AudioDecoder
{
public:
- FFmpegDecoder (boost::shared_ptr<Film>, DecodeOptions, Job *);
+ FFmpegDecoder (boost::shared_ptr<Film>, DecodeOptions);
~FFmpegDecoder ();
float frames_per_second () const;
*/
try {
- Decoders d = decoder_factory (shared_from_this(), DecodeOptions(), 0);
+ Decoders d = decoder_factory (shared_from_this(), DecodeOptions());
set_size (d.video->native_size ());
set_frames_per_second (d.video->frames_per_second ());
_external_audio = a;
}
- shared_ptr<ExternalAudioDecoder> decoder (new ExternalAudioDecoder (shared_from_this(), DecodeOptions(), 0));
+ shared_ptr<ExternalAudioDecoder> decoder (new ExternalAudioDecoder (shared_from_this(), DecodeOptions()));
if (decoder->audio_stream()) {
_external_audio_stream = decoder->audio_stream ();
}
using libdcp::Size;
ImageMagickDecoder::ImageMagickDecoder (
- boost::shared_ptr<Film> f, DecodeOptions o, Job* j)
- : Decoder (f, o, j)
- , VideoDecoder (f, o, j)
+ boost::shared_ptr<Film> f, DecodeOptions o)
+ : Decoder (f, o)
+ , VideoDecoder (f, o)
{
if (boost::filesystem::is_directory (_film->content_path())) {
for (
class ImageMagickDecoder : public VideoDecoder
{
public:
- ImageMagickDecoder (boost::shared_ptr<Film>, DecodeOptions, Job *);
+ ImageMagickDecoder (boost::shared_ptr<Film>, DecodeOptions);
float frames_per_second () const {
/* We don't know */
Transcoder::Transcoder (shared_ptr<Film> f, DecodeOptions o, Job* j, shared_ptr<Encoder> e)
: _job (j)
, _encoder (e)
- , _decoders (decoder_factory (f, o, j))
+ , _decoders (decoder_factory (f, o))
{
assert (_encoder);
while (1) {
if (!done[0]) {
done[0] = _decoders.video->pass ();
- _decoders.video->set_progress ();
+ if (_job) {
+ _decoders.video->set_progress (_job);
+ }
}
if (!done[1] && _decoders.audio && dynamic_pointer_cast<Decoder> (_decoders.audio) != dynamic_pointer_cast<Decoder> (_decoders.video)) {
using boost::shared_ptr;
using boost::optional;
-VideoDecoder::VideoDecoder (shared_ptr<Film> f, DecodeOptions o, Job* j)
- : Decoder (f, o, j)
+VideoDecoder::VideoDecoder (shared_ptr<Film> f, DecodeOptions o)
+ : Decoder (f, o)
, _video_frame (0)
, _last_source_time (0)
{
}
void
-VideoDecoder::set_progress () const
+VideoDecoder::set_progress (Job* j) const
{
- if (_job && _film->length()) {
- _job->set_progress (float (_video_frame) / _film->length().get());
+ assert (j);
+
+ if (_film->length()) {
+ j->set_progress (float (_video_frame) / _film->length().get());
}
}
class VideoDecoder : public VideoSource, public virtual Decoder
{
public:
- VideoDecoder (boost::shared_ptr<Film>, DecodeOptions, Job *);
+ VideoDecoder (boost::shared_ptr<Film>, DecodeOptions);
/** @return video frames per second, or 0 if unknown */
virtual float frames_per_second () const = 0;
virtual void set_subtitle_stream (boost::shared_ptr<SubtitleStream>);
- void set_progress () const;
+ void set_progress (Job *) const;
int video_frame () const {
return _video_frame;
o.decode_audio = false;
o.decode_subtitles = true;
o.video_sync = false;
- _decoders = decoder_factory (_film, o, 0);
+ _decoders = decoder_factory (_film, o);
_decoders.video->Video.connect (bind (&FilmViewer::process_video, this, _1, _2, _3));
_decoders.video->OutputChanged.connect (boost::bind (&FilmViewer::decoder_changed, this));
_decoders.video->set_subtitle_stream (_film->subtitle_stream());