X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_decoder.h;h=be178dbfbfc1d57232c89223e2f2ca62f0a90e36;hb=01791aac0b11e9f296cd31a7803e287203bd8355;hp=1e273752a59e874d8fde97fa22d261a56e9a5d2d;hpb=23050047454f1c1f7aadad41bf7b05d00d8ffe7f;p=dcpomatic.git diff --git a/src/lib/ffmpeg_decoder.h b/src/lib/ffmpeg_decoder.h index 1e273752a..be178dbfb 100644 --- a/src/lib/ffmpeg_decoder.h +++ b/src/lib/ffmpeg_decoder.h @@ -35,8 +35,6 @@ extern "C" { #include "decoder.h" #include "video_decoder.h" #include "audio_decoder.h" -#include "film.h" -#include "ffmpeg_content.h" struct AVFilterGraph; struct AVCodecContext; @@ -50,6 +48,8 @@ class Job; class Options; class Image; class Log; +class FFmpegContent; +class Film; /** @class FFmpegDecoder * @brief A decoder using FFmpeg to decode content. @@ -57,29 +57,37 @@ class Log; class FFmpegDecoder : public VideoDecoder, public AudioDecoder { public: - FFmpegDecoder (boost::shared_ptr, boost::shared_ptr, bool video, bool audio, bool subtitles); + FFmpegDecoder (boost::shared_ptr, boost::shared_ptr, bool video, bool audio); ~FFmpegDecoder (); + /* Decoder */ + + void pass (); + void seek (Time); + void seek_back (); + void seek_forward (); + Time position () const; + bool done () const; + + /* VideoDecoder */ + float video_frame_rate () const; - libdcp::Size native_size () const; + libdcp::Size video_size () const; ContentVideoFrame video_length () const; - int time_base_numerator () const; - int time_base_denominator () const; - int sample_aspect_ratio_numerator () const; - int sample_aspect_ratio_denominator () const; - std::vector subtitle_streams () const { + /* FFmpegDecoder */ + + std::vector > subtitle_streams () const { return _subtitle_streams; } - std::vector audio_streams () const { + std::vector > audio_streams () const { return _audio_streams; } - bool seek (double); - bool seek_forward (); - bool seek_back (); - bool pass (); + boost::shared_ptr ffmpeg_content () const { + return _ffmpeg_content; + } private: @@ -90,22 +98,19 @@ private: PixelFormat pixel_format () const; AVSampleFormat audio_sample_format () const; int bytes_per_audio_sample () const; - bool do_seek (double, bool, bool); - - void filter_and_emit_video (); + void do_seek (Time, bool, bool); void setup_general (); void setup_video (); void setup_audio (); void setup_subtitle (); + bool decode_video_packet (); void decode_audio_packet (); void maybe_add_subtitle (); boost::shared_ptr deinterleave_audio (uint8_t** data, int size); - void film_changed (Film::Property); - std::string stream_name (AVStream* s) const; boost::shared_ptr _ffmpeg_content; @@ -127,12 +132,11 @@ private: std::list > _filter_graphs; boost::mutex _filter_graphs_mutex; - std::vector _subtitle_streams; - std::vector _audio_streams; + std::vector > _subtitle_streams; + std::vector > _audio_streams; bool _decode_video; bool _decode_audio; - bool _decode_subtitles; /* It would appear (though not completely verified) that one must have a mutex around calls to avcodec_open* and avcodec_close... and here