summaryrefslogtreecommitdiff
path: root/src/Dict.cpp
diff options
context:
space:
mode:
authorjhurst <jhurst@cinecert.com>2009-05-18 23:34:18 +0000
committerjhurst <>2009-05-18 23:34:18 +0000
commitfd73a272189d3d121989b8437b7fbe5402160aaa (patch)
treed5ae5116fed0ef44db4b9afe3b1e77a7d515a005 /src/Dict.cpp
parentb6f407694245e9310cb164b69e54fca32f1cbb8b (diff)
working multi-dict
Diffstat (limited to 'src/Dict.cpp')
-rwxr-xr-xsrc/Dict.cpp142
1 files changed, 120 insertions, 22 deletions
diff --git a/src/Dict.cpp b/src/Dict.cpp
index deb05d8..aaef990 100755
--- a/src/Dict.cpp
+++ b/src/Dict.cpp
@@ -31,67 +31,165 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "KM_mutex.h"
+#include "KM_log.h"
#include "KLV.h"
#include "MDD.cpp"
//------------------------------------------------------------------------------------------
-//static ASDCP::Dictionary s_SMPTEDict;
-//static ASDCP::Dictionary s_InteropDict;
+// The composite dict is the union of the SMPTE and Interop dicts
+//
+static ASDCP::Dictionary s_CompositeDict;
+static Kumu::Mutex s_CompositeDictLock;
+static bool s_CompositeDictInit = false;
+//
const ASDCP::Dictionary&
-ASDCP::DefaultSMPTEDict() {
- // return s_SMPTEDict;
- return DefaultCompositeDict();
+ASDCP::DefaultCompositeDict()
+{
+ if ( ! s_CompositeDictInit )
+ {
+ Kumu::AutoMutex AL(s_CompositeDictLock);
+
+ if ( ! s_CompositeDictInit )
+ {
+ s_CompositeDict.Init();
+ s_CompositeDictInit = true;
+ }
+ }
+
+ return s_CompositeDict;
}
+//
+//
+static ASDCP::Dictionary s_InteropDict;
+static Kumu::Mutex s_InteropDictLock;
+static bool s_InteropDictInit = false;
+
+//
const ASDCP::Dictionary&
-ASDCP::DefaultInteropDict() {
- // return s_InteropDict;
- return DefaultCompositeDict();
+ASDCP::DefaultInteropDict()
+{
+ if ( ! s_InteropDictInit )
+ {
+ Kumu::AutoMutex AL(s_InteropDictLock);
+
+ if ( ! s_InteropDictInit )
+ {
+ s_InteropDict.Init();
+
+ s_InteropDict.AddEntry(s_InteropDict.Type(MDD_MXFInterop_OPAtom), MDD_OPAtom);
+ s_InteropDict.AddEntry(s_InteropDict.Type(MDD_MXFInterop_CryptEssence), MDD_CryptEssence);
+ s_InteropDict.AddEntry(s_InteropDict.Type(MDD_MXFInterop_GenericDescriptor_SubDescriptors),
+ MDD_GenericDescriptor_SubDescriptors);
+ s_InteropDict.DeleteEntry(MDD_TimedTextWrapping);
+ s_InteropDict.DeleteEntry(MDD_TimedTextEssence);
+ s_InteropDict.DeleteEntry(MDD_TimedTextDescriptor);
+ s_InteropDict.DeleteEntry(MDD_TimedTextDescriptor_ResourceID);
+ s_InteropDict.DeleteEntry(MDD_TimedTextDescriptor_UCSEncoding);
+ s_InteropDict.DeleteEntry(MDD_TimedTextDescriptor_NamespaceURI);
+ s_InteropDict.DeleteEntry(MDD_TimedTextResourceSubDescriptor);
+ s_InteropDict.DeleteEntry(MDD_TimedTextResourceSubDescriptor_AncillaryResourceID);
+ s_InteropDict.DeleteEntry(MDD_TimedTextResourceSubDescriptor_MIMEMediaType);
+ s_InteropDict.DeleteEntry(MDD_TimedTextResourceSubDescriptor_EssenceStreamID);
+ s_InteropDict.DeleteEntry(MDD_GenericStreamPartition);
+ s_InteropDict.DeleteEntry(MDD_StereoscopicPictureSubDescriptor);
+ s_InteropDict.DeleteEntry(MDD_GenericStream_DataElement);
+
+ s_InteropDictInit = true;
+ }
+ }
+
+ return s_InteropDict;
}
//
//
-static ASDCP::Dictionary s_CompositeDict;
-static Kumu::Mutex s_Lock;
-static bool s_md_init = false;
+static ASDCP::Dictionary s_SMPTEDict;
+static Kumu::Mutex s_SMPTEDictLock;
+static bool s_SMPTEDictInit = false;
//
const ASDCP::Dictionary&
-ASDCP::DefaultCompositeDict()
+ASDCP::DefaultSMPTEDict()
{
- if ( ! s_md_init )
+ if ( ! s_SMPTEDictInit )
{
- Kumu::AutoMutex AL(s_Lock);
+ Kumu::AutoMutex AL(s_SMPTEDictLock);
- if ( ! s_md_init )
+ if ( ! s_SMPTEDictInit )
{
- for ( ui32_t x = 0; x < ASDCP::MDD_Table_size; x++ )
- s_CompositeDict.AddEntry(s_MDD_Table[x], x);
- // s_md_lookup.insert(std::map<UL, ui32_t>::value_type(UL(s_MDD_Table[x].ul), x));
+ s_SMPTEDict.Init();
- s_md_init = true;
+ s_SMPTEDict.DeleteEntry(MDD_MXFInterop_OPAtom);
+ s_SMPTEDict.DeleteEntry(MDD_MXFInterop_CryptEssence);
+ s_SMPTEDict.DeleteEntry(MDD_MXFInterop_GenericDescriptor_SubDescriptors);
+
+ s_SMPTEDictInit = true;
}
}
- return s_CompositeDict;
+ return s_SMPTEDict;
}
+
//------------------------------------------------------------------------------------------
//
ASDCP::Dictionary::Dictionary() {}
ASDCP::Dictionary::~Dictionary() {}
+//
+void
+ASDCP::Dictionary::Init()
+{
+ m_md_lookup.clear();
+ memset(m_MDD_Table, 0, sizeof(m_MDD_Table));
+
+ for ( ui32_t x = 0; x < ASDCP::MDD_Table_size; x++ )
+ AddEntry(s_MDD_Table[x], x);
+}
//
bool
ASDCP::Dictionary::AddEntry(const MDDEntry& Entry, ui32_t index)
{
- m_MDD_Table[index] = Entry;
+ bool result = true;
+ // is this index already there?
+ std::map<ui32_t, ASDCP::UL>::iterator rii = m_md_rev_lookup.find(index);
+
+ if ( rii != m_md_rev_lookup.end() )
+ {
+ DeleteEntry(index);
+ result = false;
+ }
+
m_md_lookup.insert(std::map<UL, ui32_t>::value_type(UL(Entry.ul), index));
- return true;
+ m_md_rev_lookup.insert(std::map<ui32_t, UL>::value_type(index, UL(Entry.ul)));
+ m_MDD_Table[index] = Entry;
+
+ return result;
+}
+
+//
+bool
+ASDCP::Dictionary::DeleteEntry(ui32_t index)
+{
+ // is this index already there?
+ std::map<ui32_t, ASDCP::UL>::iterator rii = m_md_rev_lookup.find(index);
+
+ if ( rii != m_md_rev_lookup.end() )
+ {
+ std::map<ASDCP::UL, ui32_t>::iterator ii = m_md_lookup.find(rii->second);
+ assert(ii != m_md_lookup.end());
+
+ char buf[64];
+ Kumu::DefaultLogSink().Warn("Deleting %s: %s\n", ii->first.EncodeString(buf, 64), m_MDD_Table[index].name);
+ return true;
+ }
+
+ return false;
}
//