SLVS has a weird UL and was not being recognized as a channel label
[asdcplib.git] / src / MXF.cpp
index df8bb2846cd5bf9c21250b7383129c51f3db7d9b..af406ee0da79debc6e1febe0b6c357e8096a1bc3 100755 (executable)
@@ -128,7 +128,7 @@ ASDCP::MXF::RIP::InitFromFile(const Kumu::FileReader& Reader)
       if (m_ValueLength < 4)
       {
         DefaultLogSink().Error("RIP is too short.\n");
-        return RESULT_FAIL;
+        return RESULT_KLV_CODING(__LINE__, __FILE__);
       }
       Kumu::MemIOReader MemRDR(m_ValueStart, m_ValueLength - 4);
       result = PairArray.Unarchive(&MemRDR) ? RESULT_OK : RESULT_KLV_CODING(__LINE__, __FILE__);
@@ -456,7 +456,7 @@ ASDCP::MXF::Primer::InitFromBuffer(const byte_t* p, ui32_t l)
       if (m_ValueStart + m_ValueLength > p + l)
       {
         DefaultLogSink().Error("Primer entry too long.\n");
-        return RESULT_FAIL;
+        return RESULT_KLV_CODING(__LINE__, __FILE__);
       }
       Kumu::MemIOReader MemRDR(m_ValueStart, m_ValueLength);
       result = LocalTagEntryBatch.Unarchive(&MemRDR) ? RESULT_OK : RESULT_KLV_CODING(__LINE__, __FILE__);
@@ -1390,11 +1390,12 @@ ASDCP::MXF::InterchangeObject::InitFromBuffer(const byte_t* p, ui32_t l)
 
       if ( ASDCP_SUCCESS(result) )
        {
-    if (m_ValueStart + m_ValueLength > p  + l)
-    {
-      DefaultLogSink().Error("Interchange Object value extends past buffer length.\n");
-      return RESULT_FAIL;
-    }
+         if ( ( m_ValueStart + m_ValueLength ) > ( p  + l ) )
+           {
+             DefaultLogSink().Error("Interchange Object value extends past buffer length.\n");
+             return RESULT_KLV_CODING(__LINE__, __FILE__);
+           }
+
          TLVReader MemRDR(m_ValueStart, m_ValueLength, m_Lookup);
          result = InitFromTLVSet(MemRDR);
        }
@@ -1544,6 +1545,35 @@ ASDCP::MXF::CreateObject(const Dictionary*& Dict, const UL& label)
 
 //------------------------------------------------------------------------------------------
 
+//
+static bool
+ul_is_an_mca_group(const ASDCP::UL& ul)
+{
+  if ( ul.Value()[10] == 2 ) // magic depends on UL "Essence Facet" byte (see ST 428-12)
+    {
+      return true;
+    }
+
+  return false;
+}
+
+//
+static bool
+ul_is_an_mca_channel(const ASDCP::UL& ul)
+{
+  if ( ul.Value()[10] == 1 ) // magic depends on UL "Essence Facet" byte (see ST 428-12)
+    {
+      return true;
+    }
+
+  if ( ul == ASDCP::DefaultSMPTEDict().ul(ASDCP::MDD_AudioChannelSLVS) ) // not all ULs obey ST 428-12!
+    {
+      return true;
+    }
+
+  return false;
+}
+
 //
 bool
 ASDCP::MXF::decode_mca_string(const std::string& s, const mca_label_map_t& labels, const Dictionary*& dict, const std::string& language,
@@ -1591,7 +1621,7 @@ ASDCP::MXF::decode_mca_string(const std::string& s, const mca_label_map_t& label
              return false;
            }
       
-         if ( i->second.ul.Value()[10] != 2 ) // magic depends on UL "Essence Facet" byte (see ST 428-12)
+         if ( ! ul_is_an_mca_group(i->second.ul) )
            {
              DefaultLogSink().Error("Not a soundfield group symbol: '%s'\n", symbol_buf.c_str());
              return false;
@@ -1663,7 +1693,7 @@ ASDCP::MXF::decode_mca_string(const std::string& s, const mca_label_map_t& label
                  return false;
                }
 
-             if ( i->second.ul.Value()[10] != 1 ) // magic depends on UL "Essence Facet" byte (see ST 428-12)
+             if ( ! ul_is_an_mca_channel(i->second.ul) )
                {
                  DefaultLogSink().Error("Not a channel symbol: '%s'\n", symbol_buf.c_str());
                  return false;
@@ -1759,6 +1789,7 @@ ASDCP::MXF::ASDCP_MCAConfigParser::ASDCP_MCAConfigParser(const Dictionary*& d) :
   m_LabelMap.insert(pair("FSKSync",   label_traits("FSK Sync"                      , true,  m_Dict->ul(MDD_DCAudioChannel_FSKSyncSignalChannel))));
   m_LabelMap.insert(pair("DBOX",  label_traits("D-BOX Motion Code Primary Stream"  , false, m_Dict->ul(MDD_DBOXMotionCodePrimaryStream))));
   m_LabelMap.insert(pair("DBOX2", label_traits("D-BOX Motion Code Secondary Stream", false, m_Dict->ul(MDD_DBOXMotionCodeSecondaryStream))));
+  m_LabelMap.insert(pair("SLVS",  label_traits("Sign Language Video Stream"        , false, m_Dict->ul(MDD_AudioChannelSLVS))));
 }
 
 //