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    Written by Moritz Bunkus <moritz@bunkus.org>.
10 */
11 
12 #pragma once
13 
14 #include "common/common_pch.h"
15 
16 #include "common/json.h"
17 #include "common/strings/editing.h"
18 
19 namespace mtx::id {
20 
21 char const * const aac_is_sbr                      = "aac_is_sbr";                      // track ascii-string format:^(true|unknown)$
22 char const * const audio_bits_per_sample           = "audio_bits_per_sample";           // track unsigned-integer
23 char const * const audio_channels                  = "audio_channels";                  // track unsigned-integer
24 char const * const audio_output_sampling_frequency = "audio_output_sampling_frequency"; // track unsigned-integer
25 char const * const audio_sampling_frequency        = "audio_sampling_frequency";        // track unsigned-integer
26 char const * const codec_delay                     = "codec_delay";                     // track unsigned-integer
27 char const * const codec_id                        = "codec_id";                        // track unicoode-string
28 char const * const codec_name                      = "codec_name";                      // track unicoode-string
29 char const * const codec_private_data              = "codec_private_data";              // track binary
30 char const * const codec_private_length            = "codec_private_length";            // track unsigned-integer
31 char const * const content_encoding_algorithms     = "content_encoding_algorithms";     // track ascii-string
32 char const * const cropping                        = "cropping";                        // track ascii-string format:
33 char const * const date_local                      = "date_local";                      // container ascii-string format:^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}([+-]\d{2}:\d{2}|Z)$
34 char const * const date_utc                        = "date_utc";                        // container ascii-string format:^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}([+-]\d{2}:\d{2}|Z)$
35 char const * const default_duration                = "default_duration";                // track unsigned-integer
36 char const * const default_track                   = "default_track";                   // track boolean
37 char const * const display_dimensions              = "display_dimensions";              // track ascii-string format:^\d+x\d+$
38 char const * const display_unit                    = "display_unit";                    // track unsigned-integer
39 char const * const duration                        = "duration";                        // container unsigned-integer
40 char const * const encoding                        = "encoding";                        // track ascii-string
41 char const * const enabled_track                   = "enabled_track";                   // track boolean
42 char const * const flag_hearing_impaired           = "flag_hearing_impaired";           // track boolean
43 char const * const flag_visual_impaired            = "flag_visual_impaired";            // track boolean
44 char const * const flag_text_descriptions          = "flag_text_descriptions";          // track boolean
45 char const * const flag_original                   = "flag_original";                   // track boolean
46 char const * const flag_commentary                 = "flag_commentary";                 // track boolean
47 char const * const forced_track                    = "forced_track";                    // track boolean
48 char const * const language                        = "language";                        // track ascii-string format:^\w{3}$
49 char const * const language_ietf                   = "language_ietf";                   // track ascii-string
50 char const * const minimum_timestamp               = "minimum_timestamp";               // track unsigned-integer
51 char const * const mpeg4_p10_es_video              = "mpeg4_p10_es_video";              // track boolean
52 char const * const mpeg4_p10_video                 = "mpeg4_p10_video";                 // track boolean
53 char const * const mpegh_p2_es_video               = "mpegh_p2_es_video";               // track boolean
54 char const * const mpegh_p2_video                  = "mpegh_p2_video";                  // track boolean
55 char const * const muxing_application              = "muxing_application";              // container unicode-string
56 char const * const multiplexed_tracks              = "multiplexed_tracks";              // track [ unsigned-integer ]
57 char const * const next_segment_uid                = "next_segment_uid";                // container ascii-string format:^[0-9A-F]{32}$
58 char const * const number                          = "number";                          // container unsigned-integer
59 char const * const other_file                      = "other_file";                      // container unicoode-string
60 char const * const packetizer                      = "packetizer";                      // track unicoode-string
61 char const * const pixel_dimensions                = "pixel_dimensions";                // track ascii-string format:^\d+x\d+$
62 char const * const playlist                        = "playlist";                        // container boolean
63 char const * const playlist_chapters               = "playlist_chapters";               // container unsigned-integer
64 char const * const playlist_duration               = "playlist_duration";               // container unsigned-integer
65 char const * const playlist_file                   = "playlist_file";                   // container uinstr
66 char const * const playlist_size                   = "playlist_size";                   // container unsigned-integer
67 char const * const previous_segment_uid            = "previous_segment_uid";            // container ascii-string format:^[0-9A-F]{32}$
68 char const * const program_number                  = "program_number";                  // track unsigned-integer, container unsigned-integer
69 char const * const programs                        = "programs";                        // container array
70 char const * const segment_uid                     = "segment_uid";                     // container ascii-string format:^[0-9A-F]{32}$
71 char const * const service_name                    = "service_name";                    // container unicode-string
72 char const * const service_provider                = "service_provider";                // container unicode-string
73 char const * const stereo_mode                     = "stereo_mode";                     // track unsigned-integer
74 char const * const stream_id                       = "stream_id";                       // track unsigned-integer
75 char const * const sub_stream_id                   = "sub_stream_id";                   // track unsigned-integer
76 char const * const teletext_page                   = "teletext_page";                   // track unsigned-integer
77 char const * const text_subtitles                  = "text_subtitles";                  // track boolean
78 char const * const title                           = "title";                           // container unicoode-string
79 char const * const track_name                      = "track_name";                      // track unicoode-string
80 char const * const uid                             = "uid";                             // track attachments unsigned-integer
81 char const * const writing_application             = "writing_application";             // container unicode-string
82 
83 using verbose_info_t = std::vector<std::pair<std::string, nlohmann::json>>;
84 
85 class info_c {
86 protected:
87   verbose_info_t m_info;
88 
89 public:
90   template<typename T> info_c &
set(std::string const & key,T const & value)91   set(std::string const &key,
92       T const &value) {
93     m_info.emplace_back(key, value);
94     return *this;
95   }
96 
97   template<typename T> info_c &
98   add(std::string const &key,
99       T const &value,
100       T const &unset_value = T{}) {
101     if (value != unset_value)
102       set(key, value);
103     return *this;
104   }
105 
106   info_c &
107   add(std::string const &key,
108       char const *value,
109       std::string const &unset_value = {}) {
110     if (std::string{value} != unset_value)
111       set(key, value);
112     return *this;
113   }
114 
115   info_c &
add(std::string const & key,std::optional<bool> const & value)116   add(std::string const &key,
117       std::optional<bool> const &value) {
118     if (value.has_value())
119       set(key, *value);
120     return *this;
121   }
122 
get()123   verbose_info_t const &get() const {
124     return m_info;
125   }
126 };
127 
128 }
129