void cues_c::postprocess_cues(KaxCues &cues, KaxCluster &cluster) { add(cues); if (m_no_cue_duration && m_no_cue_relative_position) return; auto cluster_data_start_pos = cluster.GetElementPosition() + cluster.HeadSize(); auto block_positions = calculate_block_positions(cluster); for (auto point = m_points.begin() + m_num_cue_points_postprocessed, end = m_points.end(); point != end; ++point) { // Set CueRelativePosition for all cues. if (!m_no_cue_relative_position) { auto position_itr = block_positions.find({ point->track_num, point->timecode }); auto relative_position = block_positions.end() != position_itr ? std::max(position_itr->second, cluster_data_start_pos) - cluster_data_start_pos : 0ull; assert(relative_position <= static_cast<uint64_t>(std::numeric_limits<uint32_t>::max())); point->relative_position = relative_position; mxdebug_if(m_debug_cue_relative_position, boost::format("cue_relative_position: looking for <%1%:%2%>: cluster_data_start_pos %3% position %4%\n") % point->track_num % point->timecode % cluster_data_start_pos % relative_position); } // Set CueDuration if the packetizer wants them. if (m_no_cue_duration) continue; auto duration_itr = m_id_timecode_duration_map.find({ point->track_num, point->timecode }); auto ptzr = g_packetizers_by_track_num[point->track_num]; if (!ptzr || !ptzr->wants_cue_duration()) continue; if (m_id_timecode_duration_map.end() != duration_itr) point->duration = duration_itr->second; mxdebug_if(m_debug_cue_duration, boost::format("cue_duration: looking for <%1%:%2%>: %3%\n") % point->track_num % point->timecode % (duration_itr == m_id_timecode_duration_map.end() ? static_cast<int64_t>(-1) : duration_itr->second)); } m_num_cue_points_postprocessed = m_points.size(); m_id_timecode_duration_map.clear(); }