summaryrefslogtreecommitdiff
path: root/src/MXF.cpp
diff options
context:
space:
mode:
authorjhurst <jhurst@cinecert.com>2013-06-17 17:55:54 +0000
committerjhurst <>2013-06-17 17:55:54 +0000
commitba6e57635ce6482fa9dcd6a824b579edb459b834 (patch)
treef354c0297a4233f9cb89396b2fa9fac893ba8140 /src/MXF.cpp
parente54f387729bacc2d3e8c93aeb59ee45181d6f714 (diff)
tweezes
Diffstat (limited to 'src/MXF.cpp')
-rwxr-xr-xsrc/MXF.cpp206
1 files changed, 206 insertions, 0 deletions
diff --git a/src/MXF.cpp b/src/MXF.cpp
index ad34095..6686e6a 100755
--- a/src/MXF.cpp
+++ b/src/MXF.cpp
@@ -781,6 +781,11 @@ ASDCP::MXF::OP1aHeader::InitFromBuffer(const byte_t* p, ui32_t l)
if ( object->IsA(m_Dict->ul(MDD_KLVFill)) )
{
delete object;
+
+ if ( p > end_p )
+ {
+ DefaultLogSink().Error("Fill item short read: %d.\n", p - end_p);
+ }
}
else if ( object->IsA(m_Dict->ul(MDD_Primer)) ) // TODO: only one primer should be found
{
@@ -1442,6 +1447,207 @@ ASDCP::MXF::CreateObject(const Dictionary*& Dict, const UL& label)
}
+//------------------------------------------------------------------------------------------
+
+
+ASDCP::MXF::MCAConfigParser::MCAConfigParser(const Dictionary*& d) : m_Dict(d), m_ChannelCount(0)
+{
+ label_map.insert(label_map_t::value_type("L", m_Dict->ul(MDD_DCAudioChannel_L)));
+ label_map.insert(label_map_t::value_type("R", m_Dict->ul(MDD_DCAudioChannel_R)));
+ label_map.insert(label_map_t::value_type("C", m_Dict->ul(MDD_DCAudioChannel_C)));
+ label_map.insert(label_map_t::value_type("LFE", m_Dict->ul(MDD_DCAudioChannel_LFE)));
+ label_map.insert(label_map_t::value_type("Ls", m_Dict->ul(MDD_DCAudioChannel_Ls)));
+ label_map.insert(label_map_t::value_type("Rs", m_Dict->ul(MDD_DCAudioChannel_Rs)));
+ label_map.insert(label_map_t::value_type("Lss", m_Dict->ul(MDD_DCAudioChannel_Lss)));
+ label_map.insert(label_map_t::value_type("Rss", m_Dict->ul(MDD_DCAudioChannel_Rss)));
+ label_map.insert(label_map_t::value_type("Lrs", m_Dict->ul(MDD_DCAudioChannel_Lrs)));
+ label_map.insert(label_map_t::value_type("Rrs", m_Dict->ul(MDD_DCAudioChannel_Rrs)));
+ label_map.insert(label_map_t::value_type("Lc", m_Dict->ul(MDD_DCAudioChannel_Lc)));
+ label_map.insert(label_map_t::value_type("Rc", m_Dict->ul(MDD_DCAudioChannel_Rc)));
+ label_map.insert(label_map_t::value_type("Cs", m_Dict->ul(MDD_DCAudioChannel_Cs)));
+ label_map.insert(label_map_t::value_type("HI", m_Dict->ul(MDD_DCAudioChannel_HI)));
+ label_map.insert(label_map_t::value_type("VIN", m_Dict->ul(MDD_DCAudioChannel_VIN)));
+ label_map.insert(label_map_t::value_type("51", m_Dict->ul(MDD_DCAudioSoundfield_51)));
+ label_map.insert(label_map_t::value_type("71", m_Dict->ul(MDD_DCAudioSoundfield_71)));
+ label_map.insert(label_map_t::value_type("SDS", m_Dict->ul(MDD_DCAudioSoundfield_SDS)));
+ label_map.insert(label_map_t::value_type("61", m_Dict->ul(MDD_DCAudioSoundfield_61)));
+ label_map.insert(label_map_t::value_type("M", m_Dict->ul(MDD_DCAudioSoundfield_M)));
+}
+
+//
+ui32_t
+ASDCP::MXF::MCAConfigParser::ChannelCount() const
+{
+ return m_ChannelCount;
+}
+
+// 51(L,R,C,LFE,Ls,Rs),HI,VIN
+bool
+ASDCP::MXF::MCAConfigParser::DecodeString(const std::string& s, const std::string& language)
+{
+ std::string symbol_buf;
+ m_ChannelCount = 0;
+ ASDCP::MXF::SoundfieldGroupLabelSubDescriptor *current_soundfield = 0;
+ std::string::const_iterator i;
+
+ for ( i = s.begin(); i != s.end(); ++i )
+ {
+ if ( *i == '(' )
+ {
+ if ( current_soundfield != 0 )
+ {
+ fprintf(stderr, "Encountered '(', already processing a soundfield group.\n");
+ return false;
+ }
+
+ if ( symbol_buf.empty() )
+ {
+ fprintf(stderr, "Encountered '(', without leading soundfield group symbol.\n");
+ return false;
+ }
+
+ label_map_t::const_iterator i = label_map.find(symbol_buf);
+
+ if ( i == label_map.end() )
+ {
+ fprintf(stderr, "Unknown symbol: '%s'\n", symbol_buf.c_str());
+ return false;
+ }
+
+ if ( i->second.Value()[10] != 2 ) // magic depends on UL "Essence Facet" byte (see ST 428-12)
+ {
+ fprintf(stderr, "Not a soundfield group symbol: '%s'\n", symbol_buf.c_str());
+ return false;
+ }
+
+ current_soundfield = new ASDCP::MXF::SoundfieldGroupLabelSubDescriptor(m_Dict);
+
+ GenRandomValue(current_soundfield->InstanceUID);
+ GenRandomValue(current_soundfield->MCALinkID);
+ current_soundfield->MCATagSymbol = "sg" + i->first;
+ current_soundfield->MCATagName = i->first;
+ current_soundfield->RFC5646SpokenLanguage = language;
+ current_soundfield->MCALabelDictionaryID = i->second;
+ push_back(reinterpret_cast<ASDCP::MXF::InterchangeObject*>(current_soundfield));
+ symbol_buf.clear();
+ }
+ else if ( *i == ')' )
+ {
+ if ( current_soundfield == 0 )
+ {
+ fprintf(stderr, "Encountered ')', not currently processing a soundfield group.\n");
+ return false;
+ }
+
+ if ( symbol_buf.empty() )
+ {
+ fprintf(stderr, "Soundfield group description contains no channels.\n");
+ return false;
+ }
+
+ label_map_t::const_iterator i = label_map.find(symbol_buf);
+
+ if ( i == label_map.end() )
+ {
+ fprintf(stderr, "Unknown symbol: '%s'\n", symbol_buf.c_str());
+ return false;
+ }
+
+ ASDCP::MXF::AudioChannelLabelSubDescriptor *channel_descr =
+ new ASDCP::MXF::AudioChannelLabelSubDescriptor(m_Dict);
+
+ GenRandomValue(channel_descr->InstanceUID);
+ assert(current_soundfield);
+ channel_descr->MCALinkID = current_soundfield->MCALinkID;
+ channel_descr->MCAChannelID = m_ChannelCount++;
+ channel_descr->MCATagSymbol = "ch" + i->first;
+ channel_descr->MCATagName = i->first;
+ channel_descr->RFC5646SpokenLanguage = language;
+ channel_descr->MCALabelDictionaryID = i->second;
+ push_back(reinterpret_cast<ASDCP::MXF::InterchangeObject*>(channel_descr));
+ symbol_buf.clear();
+ current_soundfield = 0;
+ }
+ else if ( *i == ',' )
+ {
+ if ( ! symbol_buf.empty() )
+ {
+ label_map_t::const_iterator i = label_map.find(symbol_buf);
+
+ if ( i == label_map.end() )
+ {
+ fprintf(stderr, "Unknown symbol: '%s'\n", symbol_buf.c_str());
+ return false;
+ }
+
+ if ( i->second.Value()[10] != 1 ) // magic depends on UL "Essence Facet" byte (see ST 428-12)
+ {
+ fprintf(stderr, "Not a channel symbol: '%s'\n", symbol_buf.c_str());
+ return false;
+ }
+
+ ASDCP::MXF::AudioChannelLabelSubDescriptor *channel_descr =
+ new ASDCP::MXF::AudioChannelLabelSubDescriptor(m_Dict);
+
+ GenRandomValue(channel_descr->InstanceUID);
+
+ if ( current_soundfield != 0 )
+ {
+ channel_descr->MCALinkID = current_soundfield->MCALinkID;
+ }
+
+ channel_descr->MCAChannelID = m_ChannelCount++;
+ channel_descr->MCATagSymbol = "ch" + i->first;
+ channel_descr->MCATagName = i->first;
+ channel_descr->RFC5646SpokenLanguage = language;
+ channel_descr->MCALabelDictionaryID = i->second;
+ push_back(reinterpret_cast<ASDCP::MXF::InterchangeObject*>(channel_descr));
+ symbol_buf.clear();
+ }
+ }
+ else if ( isalnum(*i) )
+ {
+ symbol_buf += *i;
+ }
+ else if ( ! isspace(*i) )
+ {
+ fprintf(stderr, "Unexpected character '%c'.\n", *i);
+ return false;
+ }
+ }
+
+ if ( ! symbol_buf.empty() )
+ {
+ label_map_t::const_iterator i = label_map.find(symbol_buf);
+
+ if ( i == label_map.end() )
+ {
+ fprintf(stderr, "Unknown symbol: '%s'\n", symbol_buf.c_str());
+ return false;
+ }
+
+ ASDCP::MXF::AudioChannelLabelSubDescriptor *channel_descr =
+ new ASDCP::MXF::AudioChannelLabelSubDescriptor(m_Dict);
+
+ GenRandomValue(channel_descr->InstanceUID);
+
+ if ( current_soundfield != 0 )
+ {
+ channel_descr->MCALinkID = current_soundfield->MCALinkID;
+ }
+
+ channel_descr->MCAChannelID = m_ChannelCount++;
+ channel_descr->MCATagSymbol = "ch" + i->first;
+ channel_descr->MCATagName = i->first;
+ channel_descr->RFC5646SpokenLanguage = language;
+ channel_descr->MCALabelDictionaryID = i->second;
+ push_back(reinterpret_cast<ASDCP::MXF::InterchangeObject*>(channel_descr));
+ }
+
+ return true;
+}
+
+
//
// end MXF.cpp
//