summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2012-12-16 12:18:08 +0000
committerCarl Hetherington <cth@carlh.net>2012-12-16 12:18:08 +0000
commit9c58fcdb6fd8131c17456dd71c5c277a6b0ae053 (patch)
treeb18c58859a4b2365be252253e47c578bb1c33bf7 /src/lib
parent6375f7268d0acd53c6dc7968e17a15471fba3a45 (diff)
Integrated FFmpeg player (slow).
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/ab_transcoder.cc20
-rw-r--r--src/lib/ab_transcoder.h5
-rw-r--r--src/lib/decoder.cc6
-rw-r--r--src/lib/decoder.h1
-rw-r--r--src/lib/decoder_factory.cc9
-rw-r--r--src/lib/decoder_factory.h19
-rw-r--r--src/lib/examine_content_job.cc6
-rw-r--r--src/lib/ffmpeg_decoder.cc9
-rw-r--r--src/lib/ffmpeg_decoder.h2
-rw-r--r--src/lib/film.cc18
-rw-r--r--src/lib/transcoder.cc18
-rw-r--r--src/lib/transcoder.h4
12 files changed, 78 insertions, 39 deletions
diff --git a/src/lib/ab_transcoder.cc b/src/lib/ab_transcoder.cc
index 537cb4dd7..d65fcbd4e 100644
--- a/src/lib/ab_transcoder.cc
+++ b/src/lib/ab_transcoder.cc
@@ -67,12 +67,12 @@ ABTranscoder::ABTranscoder (
}
/* Set up the decoder to use the film's set streams */
- _da.first->set_subtitle_stream (_film_a->subtitle_stream ());
- _db.first->set_subtitle_stream (_film_a->subtitle_stream ());
- _da.second->set_audio_stream (_film_a->audio_stream ());
+ _da.video->set_subtitle_stream (_film_a->subtitle_stream ());
+ _db.video->set_subtitle_stream (_film_a->subtitle_stream ());
+ _da.audio->set_audio_stream (_film_a->audio_stream ());
- _da.first->Video.connect (bind (&Combiner::process_video, _combiner, _1, _2));
- _db.first->Video.connect (bind (&Combiner::process_video_b, _combiner, _1, _2));
+ _da.video->Video.connect (bind (&Combiner::process_video, _combiner, _1, _2));
+ _db.video->Video.connect (bind (&Combiner::process_video_b, _combiner, _1, _2));
if (_matcher) {
_combiner->connect_video (_matcher);
@@ -82,7 +82,7 @@ ABTranscoder::ABTranscoder (
}
if (_matcher && _delay_line) {
- _da.second->connect_audio (_delay_line);
+ _da.audio->connect_audio (_delay_line);
_delay_line->connect_audio (_matcher);
_matcher->connect_audio (_gain);
_gain->connect_audio (_encoder);
@@ -95,11 +95,11 @@ ABTranscoder::go ()
_encoder->process_begin ();
while (1) {
- bool const va = _da.first->pass ();
- bool const vb = _db.first->pass ();
- bool const a = _da.first->pass ();
+ bool const va = _da.video->pass ();
+ bool const vb = _db.video->pass ();
+ bool const a = _da.audio->pass ();
- _da.first->set_progress ();
+ _da.video->set_progress ();
if (va && vb && a) {
break;
diff --git a/src/lib/ab_transcoder.h b/src/lib/ab_transcoder.h
index 9b57e4f73..86094301b 100644
--- a/src/lib/ab_transcoder.h
+++ b/src/lib/ab_transcoder.h
@@ -25,6 +25,7 @@
#include <boost/shared_ptr.hpp>
#include <stdint.h>
#include "util.h"
+#include "decoder_factory.h"
class Job;
class Encoder;
@@ -63,8 +64,8 @@ private:
boost::shared_ptr<const Options> _opt;
Job* _job;
boost::shared_ptr<Encoder> _encoder;
- std::pair<boost::shared_ptr<VideoDecoder>, boost::shared_ptr<AudioDecoder> > _da;
- std::pair<boost::shared_ptr<VideoDecoder>, boost::shared_ptr<AudioDecoder> > _db;
+ Decoders _da;
+ Decoders _db;
boost::shared_ptr<Combiner> _combiner;
boost::shared_ptr<Matcher> _matcher;
boost::shared_ptr<DelayLine> _delay_line;
diff --git a/src/lib/decoder.cc b/src/lib/decoder.cc
index 2bacf58e7..577894996 100644
--- a/src/lib/decoder.cc
+++ b/src/lib/decoder.cc
@@ -56,3 +56,9 @@ Decoder::Decoder (boost::shared_ptr<Film> f, boost::shared_ptr<const Options> o,
{
}
+
+void
+Decoder::seek (SourceFrame f)
+{
+ throw DecodeError ("decoder does not support seek");
+}
diff --git a/src/lib/decoder.h b/src/lib/decoder.h
index e757e5401..96d3a2014 100644
--- a/src/lib/decoder.h
+++ b/src/lib/decoder.h
@@ -58,6 +58,7 @@ public:
virtual ~Decoder () {}
virtual bool pass () = 0;
+ virtual void seek (SourceFrame);
protected:
/** our Film */
diff --git a/src/lib/decoder_factory.cc b/src/lib/decoder_factory.cc
index b2118ef74..8674c6262 100644
--- a/src/lib/decoder_factory.cc
+++ b/src/lib/decoder_factory.cc
@@ -26,6 +26,7 @@
#include "imagemagick_decoder.h"
#include "film.h"
#include "external_audio_decoder.h"
+#include "decoder_factory.h"
using std::string;
using std::pair;
@@ -33,14 +34,14 @@ using std::make_pair;
using boost::shared_ptr;
using boost::dynamic_pointer_cast;
-pair<shared_ptr<VideoDecoder>, shared_ptr<AudioDecoder> >
+Decoders
decoder_factory (
shared_ptr<Film> f, shared_ptr<const Options> o, Job* j
)
{
if (boost::filesystem::is_directory (f->content_path()) || f->content_type() == STILL) {
/* A single image file, or a directory of them */
- return make_pair (
+ return Decoders (
shared_ptr<VideoDecoder> (new ImageMagickDecoder (f, o, j)),
shared_ptr<AudioDecoder> ()
);
@@ -48,8 +49,8 @@ decoder_factory (
shared_ptr<FFmpegDecoder> fd (new FFmpegDecoder (f, o, j));
if (f->use_content_audio()) {
- return make_pair (fd, fd);
+ return Decoders (fd, fd);
}
- return make_pair (fd, shared_ptr<AudioDecoder> (new ExternalAudioDecoder (f, o, j)));
+ return Decoders (fd, shared_ptr<AudioDecoder> (new ExternalAudioDecoder (f, o, j)));
}
diff --git a/src/lib/decoder_factory.h b/src/lib/decoder_factory.h
index 1f3690611..88f719ba2 100644
--- a/src/lib/decoder_factory.h
+++ b/src/lib/decoder_factory.h
@@ -17,6 +17,9 @@
*/
+#ifndef DVDOMATIC_DECODER_FACTORY_H
+#define DVDOMATIC_DECODER_FACTORY_H
+
/** @file src/decoder_factory.h
* @brief A method to create appropriate decoders for some content.
*/
@@ -27,6 +30,20 @@ class Job;
class VideoDecoder;
class AudioDecoder;
-extern std::pair<boost::shared_ptr<VideoDecoder>, boost::shared_ptr<AudioDecoder> > decoder_factory (
+struct Decoders {
+ Decoders () {}
+
+ Decoders (boost::shared_ptr<VideoDecoder> v, boost::shared_ptr<AudioDecoder> a)
+ : video (v)
+ , audio (a)
+ {}
+
+ boost::shared_ptr<VideoDecoder> video;
+ boost::shared_ptr<AudioDecoder> audio;
+};
+
+extern Decoders decoder_factory (
boost::shared_ptr<Film>, boost::shared_ptr<const Options>, Job *
);
+
+#endif
diff --git a/src/lib/examine_content_job.cc b/src/lib/examine_content_job.cc
index 7e0f7692b..5c565cd88 100644
--- a/src/lib/examine_content_job.cc
+++ b/src/lib/examine_content_job.cc
@@ -73,14 +73,14 @@ ExamineContentJob::run ()
descend (1);
- pair<shared_ptr<VideoDecoder>, shared_ptr<AudioDecoder> > decoders = decoder_factory (_film, o, this);
+ Decoders decoders = decoder_factory (_film, o, this);
set_progress_unknown ();
- while (!decoders.first->pass()) {
+ while (!decoders.video->pass()) {
/* keep going */
}
- _film->set_length (decoders.first->video_frame());
+ _film->set_length (decoders.video->video_frame());
_film->log()->log (String::compose ("Video length is %1 frames", _film->length()));
diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc
index 74eb8934c..f4c7d3d85 100644
--- a/src/lib/ffmpeg_decoder.cc
+++ b/src/lib/ffmpeg_decoder.cc
@@ -584,6 +584,14 @@ FFmpegDecoder::filter_and_emit_video (AVFrame* frame)
}
}
+void
+FFmpegDecoder::seek (SourceFrame f)
+{
+ int64_t const t = static_cast<int64_t>(f) / (av_q2d (_format_context->streams[_video_stream]->time_base) * frames_per_second());
+ av_seek_frame (_format_context, _video_stream, t, 0);
+ avcodec_flush_buffers (_video_codec_context);
+}
+
shared_ptr<FFmpegAudioStream>
FFmpegAudioStream::create (string t, optional<int> v)
{
@@ -636,3 +644,4 @@ FFmpegAudioStream::to_string () const
return String::compose ("ffmpeg %1 %2 %3 %4", _id, _sample_rate, _channel_layout, _name);
}
+
diff --git a/src/lib/ffmpeg_decoder.h b/src/lib/ffmpeg_decoder.h
index 87eebe1ec..de0a6a67c 100644
--- a/src/lib/ffmpeg_decoder.h
+++ b/src/lib/ffmpeg_decoder.h
@@ -97,6 +97,8 @@ public:
void set_audio_stream (boost::shared_ptr<AudioStream>);
void set_subtitle_stream (boost::shared_ptr<SubtitleStream>);
+ void seek (SourceFrame);
+
private:
bool pass ();
diff --git a/src/lib/film.cc b/src/lib/film.cc
index 45af7a2ec..ddc7e371c 100644
--- a/src/lib/film.cc
+++ b/src/lib/film.cc
@@ -847,20 +847,20 @@ Film::set_content (string c)
shared_ptr<Options> o (new Options ("", "", ""));
o->out_size = Size (1024, 1024);
- pair<shared_ptr<VideoDecoder>, shared_ptr<AudioDecoder> > d = decoder_factory (shared_from_this(), o, 0);
+ Decoders d = decoder_factory (shared_from_this(), o, 0);
- set_size (d.first->native_size ());
- set_frames_per_second (d.first->frames_per_second ());
- set_subtitle_streams (d.first->subtitle_streams ());
- set_content_audio_streams (d.second->audio_streams ());
+ set_size (d.video->native_size ());
+ set_frames_per_second (d.video->frames_per_second ());
+ set_subtitle_streams (d.video->subtitle_streams ());
+ set_content_audio_streams (d.audio->audio_streams ());
/* Start off with the first audio and subtitle streams */
- if (!d.second->audio_streams().empty()) {
- set_content_audio_stream (d.second->audio_streams().front());
+ if (!d.audio->audio_streams().empty()) {
+ set_content_audio_stream (d.audio->audio_streams().front());
}
- if (!d.first->subtitle_streams().empty()) {
- set_subtitle_stream (d.first->subtitle_streams().front());
+ if (!d.video->subtitle_streams().empty()) {
+ set_subtitle_stream (d.video->subtitle_streams().front());
}
{
diff --git a/src/lib/transcoder.cc b/src/lib/transcoder.cc
index 537b9b664..114803fb5 100644
--- a/src/lib/transcoder.cc
+++ b/src/lib/transcoder.cc
@@ -63,18 +63,18 @@ Transcoder::Transcoder (shared_ptr<Film> f, shared_ptr<const Options> o, Job* j,
}
/* Set up the decoder to use the film's set streams */
- _decoders.first->set_subtitle_stream (f->subtitle_stream ());
- _decoders.second->set_audio_stream (f->audio_stream ());
+ _decoders.video->set_subtitle_stream (f->subtitle_stream ());
+ _decoders.audio->set_audio_stream (f->audio_stream ());
if (_matcher) {
- _decoders.first->connect_video (_matcher);
+ _decoders.video->connect_video (_matcher);
_matcher->connect_video (_encoder);
} else {
- _decoders.first->connect_video (_encoder);
+ _decoders.video->connect_video (_encoder);
}
if (_matcher && _delay_line) {
- _decoders.second->connect_audio (_delay_line);
+ _decoders.audio->connect_audio (_delay_line);
_delay_line->connect_audio (_matcher);
_matcher->connect_audio (_gain);
_gain->connect_audio (_encoder);
@@ -93,12 +93,12 @@ Transcoder::go ()
while (1) {
if (!done[0]) {
- done[0] = _decoders.first->pass ();
- _decoders.first->set_progress ();
+ done[0] = _decoders.video->pass ();
+ _decoders.video->set_progress ();
}
- if (!done[1] && dynamic_pointer_cast<Decoder> (_decoders.second) != dynamic_pointer_cast<Decoder> (_decoders.first)) {
- done[1] = _decoders.second->pass ();
+ if (!done[1] && dynamic_pointer_cast<Decoder> (_decoders.audio) != dynamic_pointer_cast<Decoder> (_decoders.video)) {
+ done[1] = _decoders.audio->pass ();
} else {
done[1] = true;
}
diff --git a/src/lib/transcoder.h b/src/lib/transcoder.h
index e3ca2bb32..35aac0b50 100644
--- a/src/lib/transcoder.h
+++ b/src/lib/transcoder.h
@@ -24,6 +24,8 @@
* as a parameter to the constructor.
*/
+#include "decoder_factory.h"
+
class Film;
class Job;
class Encoder;
@@ -55,7 +57,7 @@ protected:
/** The encoder that we will use */
boost::shared_ptr<Encoder> _encoder;
/** The decoders that we will use */
- std::pair<boost::shared_ptr<VideoDecoder>, boost::shared_ptr<AudioDecoder> > _decoders;
+ Decoders _decoders;
boost::shared_ptr<Matcher> _matcher;
boost::shared_ptr<DelayLine> _delay_line;
boost::shared_ptr<Gain> _gain;