extern "C" {
#include <libavutil/samplefmt.h>
}
+#include "util.h"
-class FilmState;
class Options;
class Image;
-class Log;
class Subtitle;
+class AudioBuffers;
+class Film;
/** @class Encoder
* @brief Parent class for classes which can encode video and audio frames.
class Encoder
{
public:
- Encoder (boost::shared_ptr<const FilmState> s, boost::shared_ptr<const Options> o, Log* l);
+ Encoder (boost::shared_ptr<const Film> f, boost::shared_ptr<const Options> o);
+ virtual ~Encoder () {}
/** Called to indicate that a processing run is about to begin */
- virtual void process_begin (int64_t audio_channel_layout, AVSampleFormat audio_sample_format) = 0;
+ virtual void process_begin (int64_t audio_channel_layout) = 0;
- /** Called with a frame of video.
+ /** Call with a frame of video.
* @param i Video frame image.
- * @param f Frame number within the film.
+ * @param f Frame number within the film's source.
* @param s A subtitle that should be on this frame, or 0.
*/
- virtual void process_video (boost::shared_ptr<Image> i, int f, boost::shared_ptr<Subtitle> s) = 0;
+ void process_video (boost::shared_ptr<const Image> i, SourceFrame f, boost::shared_ptr<Subtitle> s);
- /** Called with some audio data.
- * @param d Data.
- * @param s Size of data (in bytes)
- */
- virtual void process_audio (uint8_t* d, int s) = 0;
+ /** Call with some audio data */
+ void process_audio (boost::shared_ptr<const AudioBuffers>, int64_t);
/** Called when a processing run has finished */
virtual void process_end () = 0;
float current_frames_per_second () const;
bool skipping () const;
- int last_frame () const;
+ SourceFrame last_frame () const;
protected:
- void frame_done (int n);
+
+ /** Called with a frame of video.
+ * @param i Video frame image.
+ * @param f Frame number within the film's source.
+ * @param s A subtitle that should be on this frame, or 0.
+ */
+ virtual void do_process_video (boost::shared_ptr<const Image> i, SourceFrame f, boost::shared_ptr<Subtitle> s) = 0;
+
+ /** Called with some audio data */
+ virtual void do_process_audio (boost::shared_ptr<const AudioBuffers>) = 0;
+
+ void frame_done (SourceFrame n);
void frame_skipped ();
- /** FilmState of the film that we are encoding */
- boost::shared_ptr<const FilmState> _fs;
+ /** Film that we are encoding */
+ boost::shared_ptr<const Film> _film;
/** Options */
boost::shared_ptr<const Options> _opt;
- /** Log */
- Log* _log;
/** Mutex for _time_history, _just_skipped and _last_frame */
mutable boost::mutex _history_mutex;
static int const _history_size;
/** true if the last frame we processed was skipped (because it was already done) */
bool _just_skipped;
- /** Index of the last frame to be processed */
- int _last_frame;
+ /** Source index of the last frame to be processed */
+ SourceFrame _last_frame;
};
#endif