X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2FDict.cpp;h=e2aadcbf28385f2d7aefc04155cb3f029c5c6f14;hb=830570c46c4d39a8a5767f83875e3ef2f79ecc98;hp=384843e45e936073b814b6025eb086fe0abe0e54;hpb=9bfe9676115531eb76649e1ebd5e14b904b53ae2;p=asdcplib.git diff --git a/src/Dict.cpp b/src/Dict.cpp index 384843e..e2aadcb 100755 --- a/src/Dict.cpp +++ b/src/Dict.cpp @@ -30,14 +30,18 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include "KM_mutex.h" #include "KLV.h" #include "MDD.cpp" +#include + +static Kumu::Mutex s_Lock; +static bool s_md_init = false; +static std::map s_md_lookup; //------------------------------------------------------------------------------------------ // singleton wrapper -const byte_t mdd_key[] = { 0x06, 0x0e, 0x2b, 0x34 }; - // const ASDCP::MDDEntry& ASDCP::Dict::Type(MDD_t type_id) @@ -45,57 +49,40 @@ ASDCP::Dict::Type(MDD_t type_id) return s_MDD_Table[type_id]; } + // const ASDCP::MDDEntry* ASDCP::Dict::FindUL(const byte_t* ul_buf) { - ui32_t t_idx = 0; - ui32_t k_idx = 8; - - // must be a pointer to a SMPTE UL - if ( ul_buf == 0 || memcmp(mdd_key, ul_buf, 4) != 0 ) - return 0; - - // advance to first matching element - // TODO: optimize using binary search - while ( s_MDD_Table[t_idx].ul != 0 - && s_MDD_Table[t_idx].ul[k_idx] != ul_buf[k_idx] ) - t_idx++; - - if ( s_MDD_Table[t_idx].ul == 0 ) - return 0; - - // match successive elements - while ( s_MDD_Table[t_idx].ul != 0 - && k_idx < SMPTE_UL_LENGTH - 1 - && s_MDD_Table[t_idx].ul[k_idx] == ul_buf[k_idx] ) + if ( ! s_md_init ) { - if ( s_MDD_Table[t_idx].ul[k_idx+1] == ul_buf[k_idx+1] ) - { - k_idx++; - } - else + Kumu::AutoMutex AL(s_Lock); + + if ( ! s_md_init ) { - while ( s_MDD_Table[t_idx].ul != 0 - && s_MDD_Table[t_idx].ul[k_idx] == ul_buf[k_idx] - && s_MDD_Table[t_idx].ul[k_idx+1] != ul_buf[k_idx+1] ) - t_idx++; - - while ( s_MDD_Table[t_idx].ul[k_idx] != ul_buf[k_idx] ) - k_idx--; + for ( ui32_t x = 0; x < s_MDD_Table_size; x++ ) + s_md_lookup.insert(std::map::value_type(UL(s_MDD_Table[x].ul), x)); + + s_md_init = true; } } - return (s_MDD_Table[t_idx].ul == 0 ? 0 : &s_MDD_Table[t_idx]); -} - + std::map::iterator i = s_md_lookup.find(UL(ul_buf)); + + if ( i == s_md_lookup.end() ) + { + byte_t tmp_ul[SMPTE_UL_LENGTH]; + memcpy(tmp_ul, ul_buf, SMPTE_UL_LENGTH); + tmp_ul[SMPTE_UL_LENGTH-1] = 0; -// -// implementation + i = s_md_lookup.find(UL(tmp_ul)); -ASDCP::Dict::Dict() { DefaultLogSink().Warn("new Dict\n"); } -ASDCP::Dict::~Dict() {} + if ( i == s_md_lookup.end() ) + return 0; + } + return &s_MDD_Table[(*i).second]; +} //