1 /**
2    mkvpropedit -- utility for editing properties of existing Matroska files
3 
4    Distributed under the GPL v2
5    see the file COPYING for details
6    or visit https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
7 
8    \file
9 
10    \author Written by Moritz Bunkus <moritz@bunkus.org>.
11 */
12 
13 #pragma once
14 
15 #include "common/common_pch.h"
16 
17 #include <ebml/EbmlElement.h>
18 #include <matroska/KaxInfo.h>
19 #include <matroska/KaxInfoData.h>
20 #include <matroska/KaxTracks.h>
21 #include <matroska/KaxTrackAudio.h>
22 #include <matroska/KaxTrackEntryData.h>
23 #include <matroska/KaxTrackVideo.h>
24 
25 #include "common/ebml.h"
26 #include "common/translation.h"
27 
28 class property_element_c {
29 public:
30   enum ebml_type_e { EBMLT_SKIP, EBMLT_BOOL, EBMLT_BINARY, EBMLT_FLOAT, EBMLT_INT, EBMLT_UINT, EBMLT_STRING, EBMLT_USTRING, EBMLT_DATE };
31 
32   std::string m_name;
33   translatable_string_c m_title, m_description;
34 
35   EbmlCallbacks const *m_callbacks, *m_sub_master_callbacks, *m_sub_sub_master_callbacks, *m_sub_sub_sub_master_callbacks;
36 
37   unsigned int m_bit_length;
38   ebml_type_e m_type;
39 
40   property_element_c();
41   property_element_c(std::string name, EbmlCallbacks const &callbacks, translatable_string_c title, translatable_string_c description,
42                      EbmlCallbacks const &sub_master_callbacks, EbmlCallbacks const *sub_sub_master_callbacks = nullptr, EbmlCallbacks const *sub_sub_sub_master_callbacks = nullptr);
43 
44   bool is_valid() const;
45 
46 private:
47   void derive_type();
48 
49 private:                        // static
50   static std::map<uint32_t, std::vector<property_element_c> > s_properties;
51   static std::map<uint32_t, std::vector<property_element_c> > s_composed_properties;
52 
53 public:                         // static
54   static void init_tables();
55   static std::vector<property_element_c> &get_table_for(const EbmlCallbacks &master_callbacks, const EbmlCallbacks *sub_master_callbacks = nullptr, bool full_table = false);
56 };
57 using property_element_cptr = std::shared_ptr<property_element_c>;
58