X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_decoder.h;h=35688003ec9b9975cbedd251d9b20cacf5879520;hb=7bf30cdae222915bd148522227858f49b553d799;hp=c04dba5b3cbd0be52b68e46282403b74bbaee01d;hpb=09a95eca971ddd2ea75cd615e7ef2b997d52b690;p=dcpomatic.git diff --git a/src/lib/ffmpeg_decoder.h b/src/lib/ffmpeg_decoder.h index c04dba5b3..35688003e 100644 --- a/src/lib/ffmpeg_decoder.h +++ b/src/lib/ffmpeg_decoder.h @@ -26,12 +26,16 @@ #include #include #include +#include extern "C" { #include #include } #include "util.h" #include "decoder.h" +#include "video_decoder.h" +#include "audio_decoder.h" +#include "film.h" struct AVFilterGraph; struct AVCodecContext; @@ -46,35 +50,67 @@ class Options; class Image; class Log; +class FFmpegAudioStream : public AudioStream +{ +public: + FFmpegAudioStream (std::string n, int i, int s, int64_t c) + : AudioStream (s, c) + , _name (n) + , _id (i) + {} + + std::string to_string () const; + + std::string name () const { + return _name; + } + + int id () const { + return _id; + } + + static boost::shared_ptr create (std::string t, boost::optional v); + +private: + friend class stream_test; + + FFmpegAudioStream (std::string t, boost::optional v); + + std::string _name; + int _id; +}; + /** @class FFmpegDecoder * @brief A decoder using FFmpeg to decode content. */ -class FFmpegDecoder : public Decoder +class FFmpegDecoder : public VideoDecoder, public AudioDecoder { public: - FFmpegDecoder (boost::shared_ptr, boost::shared_ptr, Job *, bool, bool); + FFmpegDecoder (boost::shared_ptr, boost::shared_ptr, Job *); ~FFmpegDecoder (); - /* Methods to query our input video */ float frames_per_second () const; Size native_size () const; - int audio_channels () const; - int audio_sample_rate () const; - AVSampleFormat audio_sample_format () const; - int64_t audio_channel_layout () const; - bool has_subtitles () const; + SourceFrame length () const; + int time_base_numerator () const; + int time_base_denominator () const; + int sample_aspect_ratio_numerator () const; + int sample_aspect_ratio_denominator () const; + + void set_audio_stream (boost::shared_ptr); + void set_subtitle_stream (boost::shared_ptr); - std::vector audio_streams () const; - std::vector subtitle_streams () const; + bool seek (SourceFrame); private: - bool do_pass (); + bool pass (); PixelFormat pixel_format () const; - int time_base_numerator () const; - int time_base_denominator () const; - int sample_aspect_ratio_numerator () const; - int sample_aspect_ratio_denominator () const; + AVSampleFormat audio_sample_format () const; + int bytes_per_audio_sample () const; + + void out_with_sync (); + void filter_and_emit_video (AVFrame *); void setup_general (); void setup_video (); @@ -82,19 +118,18 @@ private: void setup_subtitle (); void maybe_add_subtitle (); + boost::shared_ptr deinterleave_audio (uint8_t* data, int size); + + void film_changed (Film::Property); + boost::signals2::scoped_connection _film_connection; std::string stream_name (AVStream* s) const; AVFormatContext* _format_context; int _video_stream; - int _audio_stream; ///< may be < 0 if there is no audio - int _subtitle_stream; ///< may be < 0 if there is no subtitle AVFrame* _frame; - std::vector _audio_streams; - std::vector _subtitle_streams; - AVCodecContext* _video_codec_context; AVCodec* _video_codec; AVCodecContext* _audio_codec_context; ///< may be 0 if there is no audio @@ -106,4 +141,7 @@ private: boost::optional _first_video; boost::optional _first_audio; + + std::list > _filter_graphs; + boost::mutex _filter_graphs_mutex; };