Various fixes to still-image mode.
[dcpomatic.git] / src / lib / j2k_still_encoder.cc
index 5243f066860bcab2d2fa7319b6ce5bdf12f112a9..968257691bdbe5deba66b21eb202e9d10ce82075 100644 (file)
@@ -17,8 +17,8 @@
 
 */
 
-/** @file  src/j2k_wav_encoder.cc
- *  @brief An encoder which writes JPEG2000 and WAV files.
+/** @file  src/j2k_still_encoder.cc
+ *  @brief An encoder which writes JPEG2000 files for a single still source image.
  */
 
 #include <sstream>
 #include <openjpeg.h>
 #include "j2k_still_encoder.h"
 #include "config.h"
-#include "film_state.h"
 #include "options.h"
 #include "exceptions.h"
 #include "dcp_video_frame.h"
 #include "filter.h"
 #include "log.h"
 #include "imagemagick_decoder.h"
+#include "film.h"
 
-using namespace std;
-using namespace boost;
+using std::string;
+using std::pair;
+using boost::shared_ptr;
 
-J2KStillEncoder::J2KStillEncoder (shared_ptr<const FilmState> s, shared_ptr<const Options> o, Log* l)
-       : Encoder (s, o, l)
+J2KStillEncoder::J2KStillEncoder (shared_ptr<const Film> f, shared_ptr<const EncodeOptions> o)
+       : Encoder (f, o)
 {
        
 }
 
 void
-J2KStillEncoder::process_video (shared_ptr<Image> yuv, int frame)
+J2KStillEncoder::do_process_video (shared_ptr<Image> yuv, shared_ptr<Subtitle> sub)
 {
-       pair<string, string> const s = Filter::ffmpeg_strings (_fs->filters);
+       pair<string, string> const s = Filter::ffmpeg_strings (_film->filters());
        DCPVideoFrame* f = new DCPVideoFrame (
-               yuv, _opt->out_size, _opt->padding, _fs->scaler, 0, _fs->frames_per_second, s.second,
+               yuv, sub, _opt->out_size, _opt->padding, _film->subtitle_offset(), _film->subtitle_scale(), _film->scaler(), 0, _film->frames_per_second(), s.second,
                Config::instance()->colour_lut_index(), Config::instance()->j2k_bandwidth(),
-               _log
+               _film->log()
                );
 
        if (!boost::filesystem::exists (_opt->frame_out_path (0, false))) {
@@ -63,16 +64,32 @@ J2KStillEncoder::process_video (shared_ptr<Image> yuv, int frame)
        }
 
        string const real = _opt->frame_out_path (0, false);
-       for (int i = 1; i < (_fs->still_duration * ImageMagickDecoder::static_frames_per_second()); ++i) {
+       string const real_hash = _opt->hash_out_path (0, false);
+       for (int i = 1; i < (_film->still_duration() * _film->frames_per_second()); ++i) {
+
                if (!boost::filesystem::exists (_opt->frame_out_path (i, false))) {
-                       string const link = _opt->frame_out_path (i, false);
+                       link (real, _opt->frame_out_path (i, false));
+               }
+               
+               if (!boost::filesystem::exists (_opt->hash_out_path (i, false))) {
+                       link (real_hash, _opt->hash_out_path (i, false));
+               }
+               
+               frame_done ();
+       }
+}
+
+void
+J2KStillEncoder::link (string a, string b) const
+{
 #ifdef DVDOMATIC_POSIX                 
-                       symlink (real.c_str(), link.c_str());
+       int const r = symlink (a.c_str(), b.c_str());
+       if (r) {
+               throw EncodeError ("could not create symlink");
+       }
 #endif
+       
 #ifdef DVDOMATIC_WINDOWS
-                       filesystem::copy_file (real, link);
+       boost::filesystem::copy_file (a, b);
 #endif                 
-               }
-               frame_done ();
-       }
 }