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