Merge master.
[dcpomatic.git] / src / lib / writer.cc
index cff0b5be23925ea09592b03dbcc27410f6e64e9c..cbb84a94019bc0a97fc67abf14e05545ccaf4675 100644 (file)
 #include <libdcp/sound_asset.h>
 #include <libdcp/picture_frame.h>
 #include <libdcp/reel.h>
+#include <libdcp/dcp.h>
 #include <libdcp/cpl.h>
 #include "writer.h"
 #include "compose.hpp"
 #include "film.h"
-#include "format.h"
+#include "ratio.h"
 #include "log.h"
 #include "dcp_video_frame.h"
+#include "dcp_content_type.h"
+#include "player.h"
+#include "audio_mapping.h"
 #include "config.h"
+#include "job.h"
 
 #include "i18n.h"
 
@@ -44,8 +49,9 @@ using boost::shared_ptr;
 
 int const Writer::_maximum_frames_in_memory = 8;
 
-Writer::Writer (shared_ptr<Film> f)
+Writer::Writer (shared_ptr<const Film> f, shared_ptr<Job> j)
        : _film (f)
+       , _job (j)
        , _first_nonexistant_frame (0)
        , _thread (0)
        , _finish (false)
@@ -70,28 +76,24 @@ Writer::Writer (shared_ptr<Film> f)
                new libdcp::MonoPictureAsset (
                        _film->internal_video_mxf_dir (),
                        _film->internal_video_mxf_filename (),
-                       _film->dcp_frame_rate (),
-                       _film->format()->dcp_size ()
+                       _film->dcp_video_frame_rate (),
+                       _film->container()->size (_film->full_frame ())
                        )
                );
 
        _picture_asset_writer = _picture_asset->start_write (_first_nonexistant_frame > 0);
 
-       AudioMapping m (_film);
+       _sound_asset.reset (
+               new libdcp::SoundAsset (
+                       _film->dir (_film->dcp_name()),
+                       _film->dcp_audio_mxf_filename (),
+                       _film->dcp_video_frame_rate (),
+                       _film->dcp_audio_channels (),
+                       _film->dcp_audio_frame_rate()
+                       )
+               );
        
-       if (m.dcp_channels() > 0) {
-               _sound_asset.reset (
-                       new libdcp::SoundAsset (
-                               _film->dir (_film->dcp_name()),
-                               _film->dcp_audio_mxf_filename (),
-                               _film->dcp_frame_rate (),
-                               m.dcp_channels (),
-                               dcp_audio_sample_rate (_film->audio_stream()->sample_rate())
-                               )
-                       );
-
-               _sound_asset_writer = _sound_asset->start_write ();
-       }
+       _sound_asset_writer = _sound_asset->start_write ();
 
        _thread = new boost::thread (boost::bind (&Writer::thread, this));
 }
@@ -201,6 +203,10 @@ try
                        }
                        }
                        lock.lock ();
+                       
+                       if (_film->length ()) {
+                               _job->set_progress (float(_full_written + _fake_written + _repeat_written) / _film->time_to_video_frames (_film->length()));
+                       }
 
                        ++_last_written_frame;
                }
@@ -256,21 +262,11 @@ Writer::finish ()
        _thread = 0;
 
        _picture_asset_writer->finalize ();
-
-       if (_sound_asset_writer) {
-               _sound_asset_writer->finalize ();
-       }
-
+       _sound_asset_writer->finalize ();
+       
        int const frames = _last_written_frame + 1;
-       int duration = 0;
-       if (_film->trim_type() == Film::CPL) {
-               duration = frames - _film->trim_start() - _film->trim_end();
-               _picture_asset->set_entry_point (_film->trim_start ());
-       } else {
-               duration = frames;
-       }
        
-       _picture_asset->set_duration (duration);
+       _picture_asset->set_duration (frames);
 
        /* Hard-link the video MXF into the DCP */
 
@@ -294,13 +290,7 @@ Writer::finish ()
 
        _picture_asset->set_directory (_film->dir (_film->dcp_name ()));
        _picture_asset->set_file_name (_film->dcp_video_mxf_filename ());
-
-       if (_sound_asset) {
-               if (_film->trim_type() == Film::CPL) {
-                       _sound_asset->set_entry_point (_film->trim_start ());
-               }
-               _sound_asset->set_duration (duration);
-       }
+       _sound_asset->set_duration (frames);
        
        libdcp::DCP dcp (_film->dir (_film->dcp_name()));
 
@@ -310,7 +300,7 @@ Writer::finish ()
                        _film->dcp_name(),
                        _film->dcp_content_type()->libdcp_kind (),
                        frames,
-                       _film->dcp_frame_rate ()
+                       _film->dcp_video_frame_rate ()
                        )
                );