ISDCF name fixes with > 6 channels and HI/VI (#1633).
authorCarl Hetherington <cth@carlh.net>
Fri, 18 Oct 2019 15:48:13 +0000 (17:48 +0200)
committerCarl Hetherington <cth@carlh.net>
Fri, 18 Oct 2019 15:48:13 +0000 (17:48 +0200)
src/lib/film.cc
src/lib/util.cc
test/isdcf_name_test.cc

index 93459661be39463c8cd257ee3ac3611ea85e33f1..701eecc39d9d9398534135cf3812085d87bc5732 100644 (file)
@@ -813,14 +813,21 @@ Film::isdcf_name (bool if_created_now) const
 
        /* Count mapped audio channels */
 
-       pair<int, int> ch = audio_channel_types (mapped_audio_channels(), audio_channels());
+       list<int> mapped = mapped_audio_channels ();
+
+       pair<int, int> ch = audio_channel_types (mapped, audio_channels());
        if (!ch.first && !ch.second) {
                d += "_MOS";
        } else if (ch.first) {
                d += String::compose("_%1%2", ch.first, ch.second);
        }
 
-       /* XXX: HI/VI */
+       if (audio_channels() > static_cast<int>(dcp::HI) && find(mapped.begin(), mapped.end(), dcp::HI) != mapped.end()) {
+               d += "-HI";
+       }
+       if (audio_channels() > static_cast<int>(dcp::VI) && find(mapped.begin(), mapped.end(), dcp::VI) != mapped.end()) {
+               d += "-VI";
+       }
 
        d += "_" + resolution_to_string (_resolution);
 
index 2dedc32c152efc60161722d411c7ef0511b018df..cd2d5a3685d506d9d84a09a557f4e9e512f39499 100644 (file)
@@ -779,7 +779,7 @@ careful_string_filter (string s)
 
 /** @param mapped List of mapped audio channels from a Film.
  *  @param channels Total number of channels in the Film.
- *  @return First: number of non-LFE channels, second: number of LFE channels.
+ *  @return First: number of non-LFE soundtrack channels (L/R/C/Ls/Rs/Lc/Rc/Bsl/Bsr), second: number of LFE channels.
  */
 pair<int, int>
 audio_channel_types (list<int> mapped, int channels)
@@ -793,10 +793,24 @@ audio_channel_types (list<int> mapped, int channels)
                        continue;
                }
 
-               if (static_cast<dcp::Channel> (i) == dcp::LFE) {
+               switch (static_cast<dcp::Channel>(i)) {
+               case dcp::LFE:
                        ++lfe;
-               } else {
+                       break;
+               case dcp::LEFT:
+               case dcp::RIGHT:
+               case dcp::CENTRE:
+               case dcp::LS:
+               case dcp::RS:
+               case dcp::LC:
+               case dcp::RC:
+               case dcp::BSL:
+               case dcp::BSR:
                        ++non_lfe;
+                       break;
+               case dcp::HI:
+               case dcp::VI:
+                       break;
                }
        }
 
index 8181ffc4307d3b3de439d5181d6f99b2df25bfe8..3315833b066aacef969af863a013163cfe97a161 100644 (file)
@@ -180,11 +180,42 @@ BOOST_AUTO_TEST_CASE (isdcf_name_test)
        mapping.set (0, dcp::HI, 1.0);
        sound->audio->set_mapping (mapping);
        BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_51_4K_DI_20140704_PP_SMPTE_OV");
+
        film->set_audio_channels (8);
        mapping.set (0, dcp::HI, 1.0);
        sound->audio->set_mapping (mapping);
-       BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_61_4K_DI_20140704_PP_SMPTE_OV");
+       BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_51-HI_4K_DI_20140704_PP_SMPTE_OV");
        mapping.set (0, dcp::VI, 1.0);
        sound->audio->set_mapping (mapping);
+       BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_51-HI-VI_4K_DI_20140704_PP_SMPTE_OV");
+
+       film->set_audio_channels(10);
+       mapping.set (0, dcp::LC, 1.0);
+       mapping.set (0, dcp::RC, 1.0);
+       mapping.set (0, dcp::HI, 0.0);
+       mapping.set (0, dcp::VI, 0.0);
+       sound->audio->set_mapping (mapping);
        BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_71_4K_DI_20140704_PP_SMPTE_OV");
+       mapping.set (0, dcp::HI, 1.0);
+       sound->audio->set_mapping (mapping);
+       BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_71-HI_4K_DI_20140704_PP_SMPTE_OV");
+       mapping.set (0, dcp::VI, 1.0);
+       sound->audio->set_mapping (mapping);
+       BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_71-HI-VI_4K_DI_20140704_PP_SMPTE_OV");
+
+       film->set_audio_channels(12);
+       mapping.set (0, dcp::LC, 0.0);
+       mapping.set (0, dcp::RC, 0.0);
+       mapping.set (0, dcp::BSL, 1.0);
+       mapping.set (0, dcp::BSR, 1.0);
+       mapping.set (0, dcp::HI, 0.0);
+       mapping.set (0, dcp::VI, 0.0);
+       sound->audio->set_mapping (mapping);
+       BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_71_4K_DI_20140704_PP_SMPTE_OV");
+       mapping.set (0, dcp::HI, 1.0);
+       sound->audio->set_mapping (mapping);
+       BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_71-HI_4K_DI_20140704_PP_SMPTE_OV");
+       mapping.set (0, dcp::VI, 1.0);
+       sound->audio->set_mapping (mapping);
+       BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_71-HI-VI_4K_DI_20140704_PP_SMPTE_OV");
 }