void track_target_c::set_level1_element(ebml_element_cptr level1_element_cp, ebml_element_cptr track_headers_cp) { m_level1_element_cp = level1_element_cp; m_level1_element = static_cast<EbmlMaster *>(m_level1_element_cp.get()); m_track_headers_cp = track_headers_cp; if (non_track_target()) { m_master = m_level1_element; return; } std::map<uint8, unsigned int> num_tracks_by_type; unsigned int num_tracks_total = 0; if (!track_headers_cp) track_headers_cp = level1_element_cp; EbmlMaster *track_headers = static_cast<EbmlMaster *>(track_headers_cp.get()); size_t i; for (i = 0; track_headers->ListSize() > i; ++i) { if (!Is<KaxTrackEntry>((*track_headers)[i])) continue; KaxTrackEntry *track = dynamic_cast<KaxTrackEntry *>((*track_headers)[i]); assert(track); KaxTrackType *kax_track_type = dynamic_cast<KaxTrackType *>(FindChild<KaxTrackType>(track)); track_type this_track_type = !kax_track_type ? track_video : static_cast<track_type>(uint8(*kax_track_type)); KaxTrackUID *kax_track_uid = dynamic_cast<KaxTrackUID *>(FindChild<KaxTrackUID>(track)); uint64_t track_uid = !kax_track_uid ? 0 : uint64(*kax_track_uid); KaxTrackNumber *kax_track_number = dynamic_cast<KaxTrackNumber *>(FindChild<KaxTrackNumber>(track)); ++num_tracks_total; ++num_tracks_by_type[this_track_type]; bool track_matches = sm_by_uid == m_selection_mode ? m_selection_param == track_uid : sm_by_position == m_selection_mode ? m_selection_param == num_tracks_total : sm_by_number == m_selection_mode ? kax_track_number && (m_selection_param == uint64(*kax_track_number)) : (this_track_type == m_selection_track_type) && (m_selection_param == num_tracks_by_type[this_track_type]); if (!track_matches) continue; m_track_uid = track_uid; m_track_type = this_track_type; m_master = track; m_sub_master = track_video == m_track_type ? dynamic_cast<EbmlMaster *>(FindChild<KaxTrackVideo>(track)) : track_audio == m_track_type ? dynamic_cast<EbmlMaster *>(FindChild<KaxTrackAudio>(track)) : nullptr; if ( !m_sub_master && ( (track_video == m_track_type) || (track_audio == m_track_type)) && has_add_or_set_change()) { m_sub_master = track_video == m_track_type ? static_cast<EbmlMaster *>(new KaxTrackVideo) : static_cast<EbmlMaster *>(new KaxTrackAudio); m_master->PushElement(*m_sub_master); } if (sub_master_is_track()) { m_master = m_level1_element; m_sub_master = track; } return; } mxerror(boost::format(Y("No track corresponding to the edit specification '%1%' was found. %2%\n")) % m_spec % FILE_NOT_MODIFIED); }
void target_c::set_level1_element(ebml_element_cptr level1_element_cp, ebml_element_cptr track_headers_cp) { m_level1_element_cp = level1_element_cp; m_level1_element = static_cast<EbmlMaster *>(m_level1_element_cp.get()); m_track_headers_cp = track_headers_cp; if ( (target_c::tt_segment_info == m_type) || (target_c::tt_chapters == m_type) || ( (target_c::tt_tags == m_type) && ( (target_c::tom_all == m_tag_operation_mode) || (target_c::tom_global == m_tag_operation_mode)))) { m_master = m_level1_element; return; } assert( (target_c::tt_track == m_type) || ( (target_c::tt_tags == m_type) && (target_c::tom_track == m_tag_operation_mode))); std::map<uint8, unsigned int> num_tracks_by_type; unsigned int num_tracks_total = 0; if (!track_headers_cp) track_headers_cp = level1_element_cp; EbmlMaster *track_headers = static_cast<EbmlMaster *>(track_headers_cp.get()); size_t i; for (i = 0; track_headers->ListSize() > i; ++i) { if (!is_id((*track_headers)[i], KaxTrackEntry)) continue; KaxTrackEntry *track = dynamic_cast<KaxTrackEntry *>((*track_headers)[i]); assert(track); KaxTrackType *kax_track_type = dynamic_cast<KaxTrackType *>(FindChild<KaxTrackType>(track)); track_type this_track_type = !kax_track_type ? track_video : static_cast<track_type>(uint8(*kax_track_type)); KaxTrackUID *kax_track_uid = dynamic_cast<KaxTrackUID *>(FindChild<KaxTrackUID>(track)); uint64_t track_uid = !kax_track_uid ? 0 : uint64(*kax_track_uid); KaxTrackNumber *kax_track_number = dynamic_cast<KaxTrackNumber *>(FindChild<KaxTrackNumber>(track)); ++num_tracks_total; ++num_tracks_by_type[this_track_type]; if (debugging_requested("track_matching")) mxinfo(boost::format("Testing match (mode %1% param %2% track_type %3%) (ntt %4% ntbt %5% type %7% uid %6%)\n") % m_selection_mode % m_selection_param % m_selection_track_type % num_tracks_total % num_tracks_by_type[this_track_type] % track_uid % this_track_type); bool track_matches = target_c::sm_by_uid == m_selection_mode ? m_selection_param == track_uid : target_c::sm_by_position == m_selection_mode ? m_selection_param == num_tracks_total : target_c::sm_by_number == m_selection_mode ? kax_track_number && (m_selection_param == uint64(*kax_track_number)) : (this_track_type == m_selection_track_type) && (m_selection_param == num_tracks_by_type[this_track_type]); if (!track_matches) continue; m_track_uid = track_uid; m_track_type = this_track_type; m_master = track; m_sub_master = track_video == m_track_type ? dynamic_cast<EbmlMaster *>(FindChild<KaxTrackVideo>(track)) : track_audio == m_track_type ? dynamic_cast<EbmlMaster *>(FindChild<KaxTrackAudio>(track)) : nullptr; if ( !m_sub_master && ( (track_video == m_track_type) || (track_audio == m_track_type)) && has_add_or_set_change()) { m_sub_master = track_video == m_track_type ? static_cast<EbmlMaster *>(new KaxTrackVideo) : static_cast<EbmlMaster *>(new KaxTrackAudio); m_master->PushElement(*m_sub_master); } if (target_c::tt_tags == m_type) { m_master = m_level1_element; m_sub_master = track; } return; } mxerror(boost::format(Y("No track corresponding to the edit specification '%1%' was found. %2%\n")) % m_spec % FILE_NOT_MODIFIED); }