1 /* 2 mkvmerge -- utility for splicing together matroska files 3 from component media subtypes 4 5 Distributed under the GPL v2 6 see the file COPYING for details 7 or visit https://www.gnu.org/licenses/old-licenses/gpl-2.0.html 8 9 high level Matroska file reader 10 11 Written by Moritz Bunkus <moritz@bunkus.org>. 12 */ 13 14 #pragma once 15 16 #include "common/common_pch.h" 17 18 #include <matroska/KaxSegment.h> 19 #include <matroska/KaxCluster.h> 20 21 #include "common/vint.h" 22 23 class kax_file_c { 24 protected: 25 mm_io_c &m_in; 26 bool m_resynced, m_reporting_enabled{true}; 27 uint64_t m_resync_start_pos, m_file_size, m_segment_end; 28 int64_t m_timestamp_scale, m_last_timestamp; 29 std::shared_ptr<libebml::EbmlStream> m_es; 30 31 debugging_option_c m_debug_read_next, m_debug_resync; 32 33 public: 34 kax_file_c(mm_io_c &in); 35 virtual ~kax_file_c() = default; 36 37 virtual bool was_resynced() const; 38 virtual int64_t get_resync_start_pos() const; 39 40 virtual std::shared_ptr<libebml::EbmlElement> read_next_level1_element(uint32_t wanted_id = 0, bool report_cluster_timestamp = false); 41 virtual std::shared_ptr<libmatroska::KaxCluster> read_next_cluster(); 42 43 virtual std::shared_ptr<libebml::EbmlElement> resync_to_level1_element(uint32_t wanted_id = 0); 44 virtual std::shared_ptr<libmatroska::KaxCluster> resync_to_cluster(); 45 46 virtual void set_timestamp_scale(int64_t timestamp_scale); 47 virtual void set_last_timestamp(int64_t last_timestamp); 48 virtual void set_segment_end(libebml::EbmlElement const &segment); 49 virtual uint64_t get_segment_end() const; 50 51 virtual void enable_reporting(bool enable); 52 53 protected: 54 virtual std::shared_ptr<libebml::EbmlElement> read_one_element(); 55 56 virtual std::shared_ptr<libebml::EbmlElement> read_next_level1_element_internal(uint32_t wanted_id = 0); 57 virtual std::shared_ptr<libebml::EbmlElement> resync_to_level1_element_internal(uint32_t wanted_id = 0); 58 59 virtual void report(std::string const &message); 60 61 public: 62 static bool is_level1_element_id(vint_c id); 63 static bool is_global_element_id(vint_c id); 64 static unsigned long get_element_size(libebml::EbmlElement &e); 65 }; 66 using kax_file_cptr = std::shared_ptr<kax_file_c>; 67