Do audio/video pts sync in a hopefully much more sensible way.
[dcpomatic.git] / src / lib / j2k_wav_encoder.h
index 1c2f5006590028aa503876c507173787dcd21f58..6733221deca3b47a9f785ccc312ba3f5cab6f194 100644 (file)
 #include <boost/thread/condition.hpp>
 #include <boost/thread/mutex.hpp>
 #include <boost/thread.hpp>
+#ifdef HAVE_SWRESAMPLE
+extern "C" {
+#include <libswresample/swresample.h>
+}
+#endif
 #include <sndfile.h>
 #include "encoder.h"
 
@@ -33,6 +38,8 @@ class ServerDescription;
 class DCPVideoFrame;
 class Image;
 class Log;
+class Subtitle;
+class AudioBuffers;
 
 /** @class J2KWAVEncoder
  *  @brief An encoder which writes JPEG2000 and WAV files.
@@ -43,20 +50,23 @@ public:
        J2KWAVEncoder (boost::shared_ptr<const FilmState>, boost::shared_ptr<const Options>, Log *);
        ~J2KWAVEncoder ();
 
-       void process_begin ();
-       void process_video (boost::shared_ptr<Image>, int);
-       void process_audio (uint8_t *, int);
+       void process_begin (int64_t audio_channel_layout);
+       void process_video (boost::shared_ptr<Image>, int, boost::shared_ptr<Subtitle>);
+       void process_audio (boost::shared_ptr<const AudioBuffers>);
        void process_end ();
 
-private:       
+private:
 
+       void write_audio (boost::shared_ptr<const AudioBuffers> audio) const;
        void encoder_thread (ServerDescription *);
        void close_sound_files ();
        void terminate_worker_threads ();
 
+#if HAVE_SWRESAMPLE    
+       SwrContext* _swr_context;
+#endif 
+
        std::vector<SNDFILE*> _sound_files;
-       int _deinterleave_buffer_size;
-       uint8_t* _deinterleave_buffer;
 
        bool _process_end;
        std::list<boost::shared_ptr<DCPVideoFrame> > _queue;