Actually use YUV->RGB setting when converting.
[dcpomatic.git] / src / lib / film.cc
index e5904ca1e988d3b6da451d62e1bda96154511abe..7dbeaafe9a58bf1b6cde5d0dfb5f46469863efc3 100644 (file)
 #include "cinema.h"
 #include "safe_stringstream.h"
 #include "environment_info.h"
+#include "raw_convert.h"
 #include <libcxml/cxml.h>
 #include <dcp/cpl.h>
 #include <dcp/signer.h>
 #include <dcp/util.h>
 #include <dcp/local_time.h>
-#include <dcp/raw_convert.h>
 #include <dcp/decrypted_kdm.h>
 #include <libxml++/libxml++.h>
 #include <boost/filesystem.hpp>
@@ -86,8 +86,6 @@ using boost::optional;
 using boost::is_any_of;
 using dcp::Size;
 using dcp::Signer;
-using dcp::raw_convert;
-using dcp::raw_convert;
 
 #define LOG_GENERAL(...) log()->log (String::compose (__VA_ARGS__), Log::TYPE_GENERAL);
 #define LOG_GENERAL_NC(...) log()->log (__VA_ARGS__, Log::TYPE_GENERAL);
@@ -209,14 +207,14 @@ Film::video_identifier () const
        return s.str ();
 }
          
-/** @return The path to the directory to write video frame info files to */
+/** @return The file to write video frame info to */
 boost::filesystem::path
-Film::info_dir () const
+Film::info_file () const
 {
        boost::filesystem::path p;
        p /= "info";
        p /= video_identifier ();
-       return dir (p);
+       return file (p);
 }
 
 boost::filesystem::path
@@ -318,25 +316,6 @@ Film::send_dcp_to_tms ()
        JobManager::instance()->add (j);
 }
 
-/** Count the number of frames that have been encoded for this film.
- *  @return frame count.
- */
-int
-Film::encoded_frames () const
-{
-       if (container() == 0) {
-               return 0;
-       }
-
-       int N = 0;
-       for (boost::filesystem::directory_iterator i = boost::filesystem::directory_iterator (info_dir ()); i != boost::filesystem::directory_iterator(); ++i) {
-               ++N;
-               boost::this_thread::interruption_point ();
-       }
-
-       return N;
-}
-
 shared_ptr<xmlpp::Document>
 Film::metadata () const
 {
@@ -581,11 +560,12 @@ Film::isdcf_name (bool if_created_now) const
                d << "_" << container()->isdcf_name();
        }
 
+       ContentList cl = content ();
+       
        /* XXX: this uses the first bit of content only */
 
        /* The standard says we don't do this for trailers, for some strange reason */
        if (dcp_content_type() && dcp_content_type()->libdcp_kind() != dcp::TRAILER) {
-               ContentList cl = content ();
                Ratio const * content_ratio = 0;
                for (ContentList::iterator i = cl.begin(); i != cl.end(); ++i) {
                        shared_ptr<VideoContent> vc = dynamic_pointer_cast<VideoContent> (*i);
@@ -621,25 +601,39 @@ Film::isdcf_name (bool if_created_now) const
                }
        }
 
-       switch (audio_channels ()) {
-       case 1:
-               d << "_10";
-               break;
-       case 2:
-               d << "_20";
-               break;
-       case 3:
-               d << "_30";
-               break;
-       case 4:
-               d << "_40";
-               break;
-       case 5:
-               d << "_50";
-               break;
-       case 6:
-               d << "_51";
-               break;
+       /* Find all mapped channels */
+
+       list<dcp::Channel> mapped;
+       for (ContentList::const_iterator i = cl.begin(); i != cl.end(); ++i) {
+               shared_ptr<const AudioContent> ac = dynamic_pointer_cast<const AudioContent> (*i);
+               if (ac) {
+                       list<dcp::Channel> c = ac->audio_mapping().mapped_dcp_channels ();
+                       copy (c.begin(), c.end(), back_inserter (mapped));
+               }
+       }
+
+       mapped.sort ();
+       mapped.unique ();
+       
+       /* Count them */
+                       
+       int non_lfe = 0;
+       int lfe = 0;
+       for (list<dcp::Channel>::const_iterator i = mapped.begin(); i != mapped.end(); ++i) {
+               if (static_cast<int> (*i) >= audio_channels()) {
+                       /* This channel is mapped but is not included in the DCP */
+                       continue;
+               }
+               
+               if ((*i) == dcp::LFE) {
+                       ++lfe;
+               } else {
+                       ++non_lfe;
+               }
+       }
+
+       if (non_lfe) {
+               d << "_" << non_lfe << lfe;
        }
 
        /* XXX: HI/VI */
@@ -807,32 +801,6 @@ Film::set_isdcf_date_today ()
        _isdcf_date = boost::gregorian::day_clock::local_day ();
 }
 
-boost::filesystem::path
-Film::info_path (int f, Eyes e) const
-{
-       boost::filesystem::path p;
-       p /= info_dir ();
-
-       SafeStringStream s;
-       s.width (8);
-       s << setfill('0') << f;
-
-       if (e == EYES_LEFT) {
-               s << ".L";
-       } else if (e == EYES_RIGHT) {
-               s << ".R";
-       }
-
-       s << ".md5";
-       
-       p /= s.str();
-
-       /* info_dir() will already have added any initial bit of the path,
-          so don't call file() on this.
-       */
-       return p;
-}
-
 boost::filesystem::path
 Film::j2c_path (int f, Eyes e, bool t) const
 {
@@ -1014,7 +982,11 @@ Film::playlist_content_changed (boost::weak_ptr<Content> c, int p)
 {
        if (p == VideoContentProperty::VIDEO_FRAME_RATE) {
                set_video_frame_rate (_playlist->best_dcp_frame_rate ());
-       } 
+       } else if (
+               p == AudioContentProperty::AUDIO_MAPPING ||
+               p == AudioContentProperty::AUDIO_CHANNELS) {
+               signal_changed (NAME);
+       }
 
        if (ui_signaller) {
                ui_signaller->emit (boost::bind (boost::ref (ContentChanged), c, p));
@@ -1025,6 +997,7 @@ void
 Film::playlist_changed ()
 {
        signal_changed (CONTENT);
+       signal_changed (NAME);
 }      
 
 int