unsigned long kax_file_c::get_element_size(EbmlElement *e) { auto m = dynamic_cast<EbmlMaster *>(e); if (!m || e->IsFiniteSize()) return e->GetSizeLength() + EBML_ID_LENGTH(static_cast<const EbmlId &>(*e)) + e->GetSize(); auto max_end_pos = e->GetElementPosition() + EBML_ID_LENGTH(static_cast<const EbmlId &>(*e)); for (int idx = 0, end = m->ListSize(); end > idx; ++idx) max_end_pos = std::max(max_end_pos, (*m)[idx]->GetElementPosition() + get_element_size((*m)[idx])); return max_end_pos - e->GetElementPosition(); }
uint64_t cues_c::calculate_point_size(cue_point_t const &point) const { uint64_t point_size = EBML_ID_LENGTH(EBML_ID(KaxCuePoint)) + 1 + EBML_ID_LENGTH(EBML_ID(KaxCuePoint)) + 1 + calculate_bytes_for_uint(point.timecode / g_timecode_scale) + EBML_ID_LENGTH(EBML_ID(KaxCueTrackPositions)) + 1 + EBML_ID_LENGTH(EBML_ID(KaxCueTrack)) + 1 + calculate_bytes_for_uint(point.track_num) + EBML_ID_LENGTH(EBML_ID(KaxCueClusterPosition)) + 1 + calculate_bytes_for_uint(point.cluster_position); auto codec_state_position = m_codec_state_position_map.find({ point.track_num, point.timecode }); if (codec_state_position != m_codec_state_position_map.end()) point_size += EBML_ID_LENGTH(EBML_ID(KaxCueCodecState)) + 1 + calculate_bytes_for_uint(codec_state_position->second); if (point.relative_position) point_size += EBML_ID_LENGTH(EBML_ID(KaxCueRelativePosition)) + 1 + calculate_bytes_for_uint(point.relative_position); if (point.duration) point_size += EBML_ID_LENGTH(EBML_ID(KaxCueDuration)) + 1 + calculate_bytes_for_uint(RND_TIMECODE_SCALE(point.duration) / g_timecode_scale); return point_size; }