EbmlElement * kax_file_c::read_one_element() { if (m_segment_end && (m_in->getFilePointer() >= m_segment_end)) return nullptr; int upper_lvl_el = 0; EbmlElement *l1 = m_es->FindNextElement(EBML_CLASS_CONTEXT(KaxSegment), upper_lvl_el, 0xFFFFFFFFL, true); if (!l1) return nullptr; const EbmlCallbacks *callbacks = find_ebml_callbacks(EBML_INFO(KaxSegment), EbmlId(*l1)); if (!callbacks) callbacks = &EBML_CLASS_CALLBACK(KaxSegment); EbmlElement *l2 = nullptr; try { l1->Read(*m_es.get(), EBML_INFO_CONTEXT(*callbacks), upper_lvl_el, l2, true); } catch (libebml::CRTError &e) { mxdebug_if(m_debug_resync, boost::format("exception reading element data: %1% (%2%)\n") % e.what() % e.getError()); m_in->setFilePointer(l1->GetElementPosition() + 1); delete l1; return nullptr; } unsigned long element_size = get_element_size(l1); if (m_debug_resync) mxinfo(boost::format("kax_file::read_one_element(): read element at %1% calculated size %2% stored size %3%\n") % l1->GetElementPosition() % element_size % (l1->IsFiniteSize() ? (boost::format("%1%") % l1->ElementSize()).str() : std::string("unknown"))); m_in->setFilePointer(l1->GetElementPosition() + element_size, seek_beginning); return l1; }
bool kax_file_c::is_level1_element_id(vint_c id) const { const EbmlSemanticContext &context = EBML_CLASS_CONTEXT(KaxSegment); for (size_t segment_idx = 0; EBML_CTX_SIZE(context) > segment_idx; ++segment_idx) if (EBML_ID_VALUE(EBML_CTX_IDX_ID(context,segment_idx)) == id.m_value) return true; return false; }
bool kax_file_c::is_level1_element_id(vint_c id) const { auto &context = EBML_CLASS_CONTEXT(KaxSegment); for (int segment_idx = 0, end = EBML_CTX_SIZE(context); end > segment_idx; ++segment_idx) if (EBML_ID_VALUE(EBML_CTX_IDX_ID(context,segment_idx)) == id.m_value) return true; return false; }