2 Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 /** @file src/decoder.h
21 * @brief Parent class for decoders of content.
24 #ifndef DVDOMATIC_DECODER_H
25 #define DVDOMATIC_DECODER_H
30 #include <boost/shared_ptr.hpp>
31 #include <boost/signals2.hpp>
34 #include "video_source.h"
35 #include "audio_source.h"
48 * @brief Parent class for decoders of content.
50 * These classes can be instructed run through their content
51 * (by calling ::go), and they emit signals when video or audio data is ready for something else
54 class Decoder : public VideoSource, public AudioSource
57 Decoder (boost::shared_ptr<Film>, boost::shared_ptr<const Options>, Job *);
58 virtual ~Decoder () {}
60 /* Methods to query our input video */
62 /** @return video frames per second, or 0 if unknown */
63 virtual float frames_per_second () const = 0;
64 /** @return native size in pixels */
65 virtual Size native_size () const = 0;
67 virtual int time_base_numerator () const = 0;
68 virtual int time_base_denominator () const = 0;
69 virtual int sample_aspect_ratio_numerator () const = 0;
70 virtual int sample_aspect_ratio_denominator () const = 0;
72 virtual bool pass () = 0;
75 SourceFrame video_frame () const {
79 virtual void set_audio_stream (boost::optional<AudioStream>);
80 virtual void set_subtitle_stream (boost::optional<SubtitleStream>);
82 boost::optional<AudioStream> audio_stream () const {
86 boost::optional<SubtitleStream> subtitle_stream () const {
87 return _subtitle_stream;
90 std::vector<AudioStream> audio_streams () const {
91 return _audio_streams;
94 std::vector<SubtitleStream> subtitle_streams () const {
95 return _subtitle_streams;
100 virtual PixelFormat pixel_format () const = 0;
102 void process_video (AVFrame const *);
103 void process_audio (boost::shared_ptr<AudioBuffers>);
104 void process_subtitle (boost::shared_ptr<TimedSubtitle>);
105 void repeat_last_video ();
108 boost::shared_ptr<Film> _film;
110 boost::shared_ptr<const Options> _opt;
111 /** associated Job, or 0 */
114 boost::optional<AudioStream> _audio_stream;
115 boost::optional<SubtitleStream> _subtitle_stream;
117 std::vector<AudioStream> _audio_streams;
118 std::vector<SubtitleStream> _subtitle_streams;
121 void emit_video (boost::shared_ptr<Image>, boost::shared_ptr<Subtitle>);
123 SourceFrame _video_frame;
125 std::list<boost::shared_ptr<FilterGraph> > _filter_graphs;
127 boost::shared_ptr<TimedSubtitle> _timed_subtitle;
129 boost::shared_ptr<Image> _last_image;
130 boost::shared_ptr<Subtitle> _last_subtitle;