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 class definitions for the Matroska reader 10 11 Written by Moritz Bunkus <moritz@bunkus.org>. 12 Modified by Steve Lhomme <s.lhomme@free.fr>. 13 */ 14 15 #pragma once 16 17 #include "common/common_pch.h" 18 19 #include <ctime> 20 21 #include "common/codec.h" 22 #include "common/content_decoder.h" 23 #include "common/dts.h" 24 #include "common/error.h" 25 #include "common/kax_file.h" 26 #include "common/mm_io.h" 27 #include "merge/block_addition_mapping.h" 28 #include "merge/generic_reader.h" 29 #include "merge/track_info.h" 30 31 #include <ebml/EbmlUnicodeString.h> 32 33 #include <matroska/KaxBlock.h> 34 #include <matroska/KaxCluster.h> 35 #include <matroska/KaxContentEncoding.h> 36 37 namespace mtx::id { 38 class info_c; 39 } 40 41 namespace mtx::tags { 42 struct converted_vorbis_comments_t; 43 } 44 45 struct kax_track_t { 46 uint64_t tnum, track_number, track_uid; 47 48 std::string codec_id, codec_name, source_id; 49 codec_c codec; 50 bool ms_compat; 51 52 char type; // 'v' = video, 'a' = audio, 't' = text subs, 'b' = buttons 53 char sub_type; // 't' = text, 'v' = VobSub 54 bool passthrough; // No special packetizer available. 55 56 uint32_t max_blockadd_id; 57 bool lacing_flag; 58 int64_t default_duration; 59 timestamp_c seek_pre_roll, codec_delay; 60 61 // Parameters for video tracks 62 uint64_t v_width, v_height, v_dwidth, v_dheight; 63 std::optional<uint64_t> v_dunit; 64 unsigned int v_display_unit; 65 uint64_t v_pcleft, v_pctop, v_pcright, v_pcbottom; 66 int64_t v_colour_matrix, v_bits_per_channel; 67 chroma_subsample_t v_chroma_subsample; 68 cb_subsample_t v_cb_subsample; 69 chroma_siting_t v_chroma_siting; 70 int64_t v_colour_range, v_transfer_character, v_colour_primaries, v_max_cll, v_max_fall; 71 chroma_coordinates_t v_chroma_coordinates; 72 white_colour_coordinates_t v_white_colour_coordinates; 73 double v_max_luminance, v_min_luminance; 74 int64_t v_field_order; 75 stereo_mode_c::mode v_stereo_mode; 76 char v_fourcc[5]; 77 std::optional<uint64_t> v_projection_type; 78 memory_cptr v_projection_private; 79 std::optional<double> v_projection_pose_yaw, v_projection_pose_pitch, v_projection_pose_roll; 80 std::vector<block_addition_mapping_t> block_addition_mappings; 81 82 // Parameters for audio tracks 83 uint64_t a_channels, a_bps, a_formattag; 84 double a_sfreq, a_osfreq; 85 86 memory_cptr private_data; 87 88 std::vector<memory_cptr> headers; 89 90 bool default_track, forced_track, enabled_track; 91 std::optional<bool> hearing_impaired_flag, visual_impaired_flag, text_descriptions_flag, original_flag, commentary_flag; 92 mtx::bcp47::language_c language, language_ietf, effective_language; 93 94 int64_t units_processed; 95 96 std::string track_name; 97 98 bool ok; 99 100 int64_t previous_timestamp; 101 102 content_decoder_c content_decoder; 103 104 std::shared_ptr<libmatroska::KaxTags> tags; 105 106 int ptzr; 107 generic_packetizer_c *ptzr_ptr; 108 bool headers_set; 109 110 bool ignore_duration_hack; 111 112 std::vector<memory_cptr> first_frames_data; 113 114 mtx::dts::header_t dts_header; 115 116 memory_cptr v_colour_space; 117 kax_track_tkax_track_t118 kax_track_t() 119 : tnum(0) 120 , track_number(0) 121 , track_uid(0) 122 , ms_compat(false) 123 , type(' ') 124 , sub_type(' ') 125 , passthrough(false) 126 , max_blockadd_id(0) 127 , lacing_flag(true) 128 , default_duration(0) 129 , v_width(0) 130 , v_height(0) 131 , v_dwidth(0) 132 , v_dheight(0) 133 , v_display_unit(0) 134 , v_pcleft(0) 135 , v_pctop(0) 136 , v_pcright(0) 137 , v_pcbottom(0) 138 , v_colour_matrix{-1} 139 , v_bits_per_channel{-1} 140 , v_chroma_subsample{} 141 , v_cb_subsample{} 142 , v_chroma_siting{} 143 , v_colour_range{-1} 144 , v_transfer_character{-1} 145 , v_colour_primaries{-1} 146 , v_max_cll{-1} 147 , v_max_fall{-1} 148 , v_chroma_coordinates{} 149 , v_white_colour_coordinates{} 150 , v_max_luminance{-1} 151 , v_min_luminance{-1} 152 , v_field_order{-1} 153 , v_stereo_mode(stereo_mode_c::unspecified) 154 , a_channels(0) 155 , a_bps(0) 156 , a_formattag(0) 157 , a_sfreq(8000.0) 158 , a_osfreq(0.0) 159 , default_track(true) 160 , forced_track(false) 161 , enabled_track(true) 162 , language{mtx::bcp47::language_c::parse("eng")} 163 , units_processed(0) 164 , ok(false) 165 , previous_timestamp(0) 166 , tags(nullptr) 167 , ptzr(-1) 168 , ptzr_ptr(nullptr) 169 , headers_set(false) 170 , ignore_duration_hack(false) 171 , v_colour_space(0) 172 { 173 memset(v_fourcc, 0, 5); 174 } 175 176 void handle_packetizer_display_dimensions(); 177 void handle_packetizer_pixel_cropping(); 178 void handle_packetizer_colour(); 179 void handle_packetizer_field_order(); 180 void handle_packetizer_stereo_mode(); 181 void handle_packetizer_pixel_dimensions(); 182 void handle_packetizer_default_duration(); 183 void handle_packetizer_output_sampling_freq(); 184 void handle_packetizer_codec_delay(); 185 void handle_packetizer_block_addition_mapping(); 186 void fix_display_dimension_parameters(); 187 void get_source_id_from_track_statistics_tags(); 188 void discard_track_statistics_tags(); 189 }; 190 using kax_track_cptr = std::shared_ptr<kax_track_t>; 191 192 class kax_reader_c: public generic_reader_c { 193 private: 194 enum deferred_l1_type_e { 195 dl1t_unknown, 196 dl1t_attachments, 197 dl1t_chapters, 198 dl1t_tags, 199 dl1t_tracks, 200 dl1t_seek_head, 201 dl1t_info, 202 }; 203 204 std::vector<kax_track_cptr> m_tracks; 205 std::map<generic_packetizer_c *, kax_track_t *> m_ptzr_to_track_map; 206 std::unordered_map<uint64_t, timestamp_c> m_minimum_timestamps_by_track_number; 207 std::unordered_map<uint64_t, bool> m_known_bad_track_numbers; 208 209 int64_t m_tc_scale; 210 211 kax_file_cptr m_in_file; 212 213 std::shared_ptr<libebml::EbmlStream> m_es; 214 215 int64_t m_segment_duration{}, m_last_timestamp{}, m_global_timestamp_offset{}; 216 std::string m_title; 217 218 using deferred_positions_t = std::map<deferred_l1_type_e, std::vector<int64_t> >; 219 deferred_positions_t m_deferred_l1_positions, m_handled_l1_positions; 220 221 std::string m_writing_app, m_raw_writing_app, m_muxing_app; 222 int64_t m_writing_app_ver{-1}; 223 std::optional<std::time_t> m_muxing_date_epoch; 224 225 memory_cptr m_segment_uid, m_next_segment_uid, m_previous_segment_uid; 226 227 int64_t m_attachment_id{}; 228 229 std::shared_ptr<libmatroska::KaxTags> m_tags; 230 231 file_status_e m_file_status{FILE_STATUS_MOREDATA}; 232 233 bool m_opus_experimental_warning_shown{}, m_regenerate_chapter_uids{}; 234 235 debugging_option_c m_debug_minimum_timestamp{"kax_reader|kax_reader_minimum_timestamp"}, m_debug_track_headers{"kax_reader|kax_reader_track_headers"}; 236 237 public: 238 kax_reader_c(); 239 get_format_type()240 virtual mtx::file_type_e get_format_type() const { 241 return mtx::file_type_e::matroska; 242 } 243 244 virtual void read_headers(); 245 246 virtual void set_headers(); 247 virtual void identify(); 248 virtual void create_packetizers(); 249 virtual void create_packetizer(int64_t tid); 250 virtual void add_available_track_ids(); 251 252 virtual bool probe_file() override; 253 254 protected: 255 virtual file_status_e read(generic_packetizer_c *packetizer, bool force = false) override; 256 virtual file_status_e finish_file(); 257 258 virtual void set_track_packetizer(kax_track_t *t, generic_packetizer_c *packetizer); 259 virtual void init_passthrough_packetizer(kax_track_t *t, track_info_c &nti); 260 virtual void set_packetizer_headers(kax_track_t *t); 261 virtual void read_first_frames(kax_track_t *t, unsigned num_wanted = 1); 262 virtual kax_track_t *find_track_by_num(uint64_t num, kax_track_t *c = nullptr); 263 virtual kax_track_t *find_track_by_uid(uint64_t uid, kax_track_t *c = nullptr); 264 265 virtual bool verify_acm_audio_track(kax_track_t *t); 266 virtual bool verify_ac3_audio_track(kax_track_t *t); 267 virtual bool verify_alac_audio_track(kax_track_t *t); 268 virtual bool verify_dts_audio_track(kax_track_t *t); 269 virtual bool verify_flac_audio_track(kax_track_t *t); 270 virtual bool verify_opus_audio_track(kax_track_t *t); 271 virtual bool verify_truehd_audio_track(kax_track_t *t); 272 virtual bool verify_vorbis_audio_track(kax_track_t *t); 273 virtual void verify_audio_track(kax_track_t *t); 274 virtual bool verify_mscomp_video_track(kax_track_t *t); 275 virtual bool verify_theora_video_track(kax_track_t *t); 276 virtual void verify_video_track(kax_track_t *t); 277 virtual bool verify_dvb_subtitle_track(kax_track_t *t); 278 virtual bool verify_hdmv_textst_subtitle_track(kax_track_t *t); 279 virtual bool verify_kate_subtitle_track(kax_track_t *t); 280 virtual bool verify_vobsub_subtitle_track(kax_track_t *t); 281 virtual void verify_subtitle_track(kax_track_t *t); 282 virtual void verify_button_track(kax_track_t *t); 283 virtual void verify_tracks(); 284 285 virtual bool packets_available(); 286 virtual void handle_attachments(mm_io_c *io, libebml::EbmlElement *l0, int64_t pos); 287 virtual void handle_chapters(mm_io_c *io, libebml::EbmlElement *l0, int64_t pos); 288 virtual void handle_seek_head(mm_io_c *io, libebml::EbmlElement *l0, int64_t pos); 289 virtual void handle_tags(mm_io_c *io, libebml::EbmlElement *l0, int64_t pos); 290 virtual void process_global_tags(); 291 virtual void handle_track_statistics_tags(); 292 293 virtual bool unlace_vorbis_private_data(kax_track_t *t, unsigned char *buffer, int size); 294 295 virtual void create_video_packetizer(kax_track_t *t, track_info_c &nti); 296 virtual void create_audio_packetizer(kax_track_t *t, track_info_c &nti); 297 virtual void create_subtitle_packetizer(kax_track_t *t, track_info_c &nti); 298 virtual void create_button_packetizer(kax_track_t *t, track_info_c &nti); 299 300 virtual void create_aac_audio_packetizer(kax_track_t *t, track_info_c &nti); 301 virtual void create_ac3_audio_packetizer(kax_track_t *t, track_info_c &nti); 302 virtual void create_alac_audio_packetizer(kax_track_t *t, track_info_c &nti); 303 virtual void create_dts_audio_packetizer(kax_track_t *t, track_info_c &nti); 304 #if defined(HAVE_FLAC_FORMAT_H) 305 virtual void create_flac_audio_packetizer(kax_track_t *t, track_info_c &nti); 306 #endif 307 virtual void create_mp3_audio_packetizer(kax_track_t *t, track_info_c &nti); 308 virtual void create_opus_audio_packetizer(kax_track_t *t, track_info_c &nti); 309 virtual void create_pcm_audio_packetizer(kax_track_t *t, track_info_c &nti); 310 virtual void create_truehd_audio_packetizer(kax_track_t *t, track_info_c &nti); 311 virtual void create_tta_audio_packetizer(kax_track_t *t, track_info_c &nti); 312 virtual void create_vorbis_audio_packetizer(kax_track_t *t, track_info_c &nti); 313 virtual void create_wavpack_audio_packetizer(kax_track_t *t, track_info_c &nti); 314 315 virtual void create_av1_video_packetizer(kax_track_t *t, track_info_c &nti); 316 virtual void create_avc_video_packetizer(kax_track_t *t, track_info_c &nti); 317 virtual void create_avc_es_video_packetizer(kax_track_t *t, track_info_c &nti); 318 virtual void create_hevc_video_packetizer(kax_track_t *t, track_info_c &nti); 319 virtual void create_hevc_es_video_packetizer(kax_track_t *t, track_info_c &nti); 320 virtual void create_prores_video_packetizer(kax_track_t &t, track_info_c &nti); 321 virtual void create_vc1_video_packetizer(kax_track_t *t, track_info_c &nti); 322 323 virtual void create_dvbsub_subtitle_packetizer(kax_track_t &t, track_info_c &nti); 324 325 virtual void read_headers_info(mm_io_c *io, libebml::EbmlElement *l0, int64_t position); 326 virtual void read_headers_info_writing_app(libmatroska::KaxWritingApp *&kwriting_app); 327 virtual void read_headers_track_audio(kax_track_t *track, libmatroska::KaxTrackAudio *ktaudio); 328 virtual void read_headers_track_video(kax_track_t *track, libmatroska::KaxTrackVideo *ktvideo); 329 virtual void read_headers_tracks(mm_io_c *io, libebml::EbmlElement *l0, int64_t position); 330 virtual bool read_headers_internal(); 331 virtual void read_deferred_level1_elements(libmatroska::KaxSegment &segment); 332 virtual void find_level1_elements_via_analyzer(); 333 334 virtual void process_simple_block(libmatroska::KaxCluster *cluster, libmatroska::KaxSimpleBlock *block_simple); 335 virtual void process_block_group(libmatroska::KaxCluster *cluster, libmatroska::KaxBlockGroup *block_group); 336 virtual void process_block_group_common(libmatroska::KaxBlockGroup *block_group, packet_t *packet, kax_track_t &track); 337 338 void init_l1_position_storage(deferred_positions_t &storage); 339 virtual bool has_deferred_element_been_processed(deferred_l1_type_e type, int64_t position); 340 341 virtual void determine_minimum_timestamps(); 342 virtual void determine_global_timestamp_offset_to_apply(); 343 virtual void adjust_chapter_timestamps(); 344 345 virtual void handle_vorbis_comments(kax_track_t &t); 346 virtual void handle_vorbis_comments_cover_art(mtx::tags::converted_vorbis_comments_t const &converted); 347 virtual void handle_vorbis_comments_tags(mtx::tags::converted_vorbis_comments_t const &converted, kax_track_t &t); 348 }; 349