diff --git a/ChangeLog b/ChangeLog index e6a1d7a33..6639ffe21 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2012-01-27 Moritz Bunkus + * mmg: bug fix: The header editor was sometimes creating two + instances of an element if an element was added to the second or + one of the later tracks. Fix for bug 711. + * mkvpropedit, mmg: bug fix: Trying to modify a file located in a path mounted with GVFS SFTP will no longer crash the programs. Instead an error message is output if an error diff --git a/src/mmg/header_editor/frame.cpp b/src/mmg/header_editor/frame.cpp index 60482b2b0..51f353c87 100644 --- a/src/mmg/header_editor/frame.cpp +++ b/src/mmg/header_editor/frame.cpp @@ -346,6 +346,8 @@ header_editor_frame_c::handle_tracks(kax_analyzer_data_c *data) { if (!m_e_tracks) return; + he_track_type_page_c *last_track_page = NULL; + KaxTracks *kax_tracks = static_cast(m_e_tracks.get_object()); int track_type = -1; size_t i; @@ -366,7 +368,8 @@ header_editor_frame_c::handle_tracks(kax_analyzer_data_c *data) { wxString title; track_type = uint64(*k_track_type); - he_track_type_page_c *page = new he_track_type_page_c(this, track_type, track_number, m_e_tracks); + he_track_type_page_c *page = new he_track_type_page_c(this, track_type, track_number, m_e_tracks, *k_track_entry); + last_track_page = page; page->init(); he_value_page_c *child_page; @@ -500,6 +503,9 @@ header_editor_frame_c::handle_tracks(kax_analyzer_data_c *data) { // m_tc_tree->ExpandAllChildren(page->m_page_id); } + + if (NULL != last_track_page) + last_track_page->set_is_last_track(true); } void diff --git a/src/mmg/header_editor/top_level_page.cpp b/src/mmg/header_editor/top_level_page.cpp index 288aa9ef2..caf214f83 100644 --- a/src/mmg/header_editor/top_level_page.cpp +++ b/src/mmg/header_editor/top_level_page.cpp @@ -21,7 +21,6 @@ #include "common/ebml.h" #include "common/segmentinfo.h" -#include "common/segment_tracks.h" #include "common/wx.h" #include "mmg/header_editor/frame.h" #include "mmg/header_editor/top_level_page.h" @@ -49,8 +48,5 @@ he_top_level_page_c::do_modifications() { if (is_id(m_l1_element, KaxInfo)) fix_mandatory_segmentinfo_elements(m_l1_element.get_object()); - else if (is_id(m_l1_element, KaxTracks)) - fix_mandatory_segment_tracks_elements(m_l1_element.get_object()); - m_l1_element->UpdateSize(true); } diff --git a/src/mmg/header_editor/track_type_page.cpp b/src/mmg/header_editor/track_type_page.cpp index 86f851dc3..b1a8e0594 100644 --- a/src/mmg/header_editor/track_type_page.cpp +++ b/src/mmg/header_editor/track_type_page.cpp @@ -21,16 +21,20 @@ #include #include "common/common_pch.h" +#include "common/segment_tracks.h" #include "common/wx.h" #include "mmg/header_editor/track_type_page.h" he_track_type_page_c::he_track_type_page_c(header_editor_frame_c *parent, int track_type, unsigned int track_number, - ebml_element_cptr l1_element) + ebml_element_cptr l1_element, + KaxTrackEntry &track_entry) : he_top_level_page_c(parent, "" , l1_element) , m_track_type(track_type) , m_track_number(track_number) + , m_track_entry(track_entry) + , m_is_last_track(false) { } @@ -59,3 +63,19 @@ he_track_type_page_c::translate_ui() { he_top_level_page_c::translate_ui(); } + +void +he_track_type_page_c::do_modifications() { + he_page_base_c::do_modifications(); + + if (!m_is_last_track) + return; + + fix_mandatory_segment_tracks_elements(m_l1_element.get_object()); + m_l1_element->UpdateSize(true); +} + +void +he_track_type_page_c::set_is_last_track(bool is_last_track) { + m_is_last_track = is_last_track; +} diff --git a/src/mmg/header_editor/track_type_page.h b/src/mmg/header_editor/track_type_page.h index abddbda5e..cd8ad007d 100644 --- a/src/mmg/header_editor/track_type_page.h +++ b/src/mmg/header_editor/track_type_page.h @@ -24,12 +24,17 @@ class he_track_type_page_c: public he_top_level_page_c { public: int m_track_type; unsigned int m_track_number; + KaxTrackEntry &m_track_entry; + bool m_is_last_track; public: - he_track_type_page_c(header_editor_frame_c *parent, int track_type, unsigned int track_number, ebml_element_cptr l1_element); + he_track_type_page_c(header_editor_frame_c *parent, int track_type, unsigned int track_number, ebml_element_cptr l1_element, KaxTrackEntry &track_entry); virtual ~he_track_type_page_c(); virtual void translate_ui(); + + virtual void set_is_last_track(bool is_last_track); + virtual void do_modifications(); }; #endif // __HE_TRACK_TYPE_PAGE_H