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