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