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 definition for the generic packetizer
10 
11    Written by Moritz Bunkus <moritz@bunkus.org>.
12 */
13 
14 #pragma once
15 
16 #include "common/common_pch.h"
17 
18 #include <deque>
19 
20 #include "common/option_with_source.h"
21 #include "common/timestamp.h"
22 #include "common/translation.h"
23 #include "merge/block_addition_mapping.h"
24 #include "merge/file_status.h"
25 #include "merge/packet.h"
26 #include "merge/timestamp_factory.h"
27 #include "merge/track_info.h"
28 #include "merge/webm.h"
29 
30 namespace libmatroska {
31 class KaxTrackEntry;
32 }
33 
34 class generic_reader_c;
35 
36 enum connection_result_e {
37   CAN_CONNECT_YES,
38   CAN_CONNECT_NO_FORMAT,
39   CAN_CONNECT_NO_PARAMETERS,
40   CAN_CONNECT_NO_UNSUPPORTED,
41   CAN_CONNECT_MAYBE_CODECPRIVATE
42 };
43 
44 enum split_result_e {
45   CAN_SPLIT_YES,
46   CAN_SPLIT_NO_UNSUPPORTED,
47 };
48 
49 using packet_cptr_di = std::deque<packet_cptr>::iterator;
50 
51 class generic_packetizer_c {
52 public:
53   enum display_dimensions_unit_e {
54     ddu_pixels       = 0,
55     ddu_centimeters  = 1,
56     ddu_inches       = 2,
57     ddu_aspect_ratio = 3,
58     ddu_unknown      = 4,
59   };
60 
61 protected:
62   int m_num_packets;
63   std::deque<packet_cptr> m_packet_queue, m_deferred_packets;
64   int m_next_packet_wo_assigned_timestamp;
65 
66   int64_t m_free_refs, m_next_free_refs, m_enqueued_bytes;
67   int64_t m_safety_last_timestamp, m_safety_last_duration;
68 
69   libmatroska::KaxTrackEntry *m_track_entry;
70 
71   // Header entries. Can be set via set_XXX and will be 'rendered'
72   // by set_headers().
73   int m_hserialno, m_htrack_type;
74   int64_t m_htrack_default_duration;
75   bool m_htrack_default_duration_indicates_fields;
76   bool m_default_duration_forced;
77   uint64_t m_huid;
78   int m_htrack_max_add_block_ids;
79   timestamp_c m_seek_pre_roll, m_codec_delay;
80 
81   std::string m_hcodec_id, m_hcodec_name;
82   memory_cptr m_hcodec_private;
83 
84   double m_haudio_sampling_freq, m_haudio_output_sampling_freq;
85   int m_haudio_channels, m_haudio_bit_depth;
86 
87   int m_hvideo_interlaced_flag, m_hvideo_pixel_width, m_hvideo_pixel_height, m_hvideo_display_width, m_hvideo_display_height, m_hvideo_display_unit;
88 
89   std::vector<block_addition_mapping_t> m_block_addition_mappings;
90 
91   compression_method_e m_hcompression;
92   compressor_ptr m_compressor;
93 
94   timestamp_factory_cptr m_timestamp_factory;
95   timestamp_factory_application_e m_timestamp_factory_application_mode;
96 
97   int64_t m_last_cue_timestamp;
98 
99   bool m_has_been_flushed;
100 
101   bool m_prevent_lacing;
102   generic_packetizer_c *m_connected_successor;
103 
104   std::string m_source_id;
105 
106 protected:                      // static
107   static int ms_track_number;
108 
109 public:
110   track_info_c m_ti;
111   generic_reader_c *m_reader;
112   int m_connected_to;
113   int64_t m_correction_timestamp_offset;
114   int64_t m_append_timestamp_offset, m_max_timestamp_seen;
115   bool m_relaxed_timestamp_checking;
116 
117 public:
118   generic_packetizer_c(generic_reader_c *reader, track_info_c &ti);
119   virtual ~generic_packetizer_c();
120 
121   virtual bool contains_gap();
122 
123   virtual file_status_e read(bool force);
124 
125   virtual void add_packet(packet_cptr const &packet);
126   virtual void add_packet2(packet_cptr const &pack);
127   virtual void process_deferred_packets();
128 
129   virtual packet_cptr get_packet();
packet_available()130   inline bool packet_available() {
131     return !m_packet_queue.empty() && m_packet_queue.front()->factory_applied;
132   }
133   void discard_queued_packets();
134   void flush();
get_smallest_timestamp()135   virtual int64_t get_smallest_timestamp() const {
136     return m_packet_queue.empty() ? 0x0FFFFFFF : m_packet_queue.front()->timestamp;
137   }
get_queued_bytes()138   inline int64_t get_queued_bytes() const {
139     return m_enqueued_bytes;
140   }
141 
set_free_refs(int64_t free_refs)142   inline void set_free_refs(int64_t free_refs) {
143     m_free_refs      = m_next_free_refs;
144     m_next_free_refs = free_refs;
145   }
get_free_refs()146   inline int64_t get_free_refs() const {
147     return m_free_refs;
148   }
149   virtual void set_headers();
150   virtual void fix_headers();
151   virtual void process(packet_cptr const &packet);
152 
set_cue_creation(cue_strategy_e create_cue_data)153   virtual void set_cue_creation(cue_strategy_e create_cue_data) {
154     m_ti.m_cues = create_cue_data;
155   }
get_cue_creation()156   virtual cue_strategy_e get_cue_creation() const {
157     return m_ti.m_cues;
158   }
159   virtual bool wants_cue_duration() const;
get_last_cue_timestamp()160   virtual int64_t get_last_cue_timestamp() const {
161     return m_last_cue_timestamp;
162   }
set_last_cue_timestamp(int64_t timestamp)163   virtual void set_last_cue_timestamp(int64_t timestamp) {
164     m_last_cue_timestamp = timestamp;
165   }
166 
get_track_entry()167   virtual libmatroska::KaxTrackEntry *get_track_entry() const {
168     return m_track_entry;
169   }
get_track_num()170   virtual int get_track_num() const {
171     return m_hserialno;
172   }
get_source_track_num()173   virtual int64_t get_source_track_num() const {
174     return m_ti.m_id;
175   }
176 
177   virtual bool set_uid(uint64_t uid);
get_uid()178   virtual uint64_t get_uid() const {
179     return m_huid;
180   }
181   virtual void set_track_type(int type, timestamp_factory_application_e tfa_mode = TFA_AUTOMATIC);
get_track_type()182   virtual int get_track_type() const {
183     return m_htrack_type;
184   }
185 
get_track_seek_pre_roll()186   virtual timestamp_c const &get_track_seek_pre_roll() const {
187     return m_seek_pre_roll;
188   }
189 
get_codec_delay()190   virtual timestamp_c const &get_codec_delay() const {
191     return m_codec_delay;
192   }
193 
194   virtual void set_language(mtx::bcp47::language_c const &language);
195 
196   virtual void set_codec_id(const std::string &id);
197   virtual void set_codec_private(memory_cptr const &buffer);
198   virtual void set_codec_name(std::string const &name);
199 
200   virtual void set_track_default_duration(int64_t default_duration, bool force = false);
201   virtual void set_track_max_additionals(int max_add_block_ids);
202   virtual int64_t get_track_default_duration() const;
203   virtual void set_track_default_flag(bool default_track);
204   virtual void set_track_forced_flag(bool forced_track);
205   virtual void set_track_enabled_flag(bool enabled_track);
206   virtual void set_track_seek_pre_roll(timestamp_c const &seek_pre_roll);
207   virtual void set_codec_delay(timestamp_c const &codec_delay);
208   virtual void set_hearing_impaired_flag(bool hearing_impaired_flag);
209   virtual void set_visual_impaired_flag(bool visual_impaired_flag);
210   virtual void set_text_descriptions_flag(bool text_descriptions_flag);
211   virtual void set_original_flag(bool original_flag);
212   virtual void set_commentary_flag(bool commentary_flag);
213 
214   virtual void set_audio_sampling_freq(double freq);
get_audio_sampling_freq()215   virtual double get_audio_sampling_freq() const {
216     return m_haudio_sampling_freq;
217   }
218   virtual void set_audio_output_sampling_freq(double freq);
219   virtual void set_audio_channels(int channels);
220   virtual void set_audio_bit_depth(int bit_depth);
221 
222   virtual void set_video_interlaced_flag(bool interlaced);
223   virtual void set_video_pixel_width(int width);
224   virtual void set_video_pixel_height(int height);
225   virtual void set_video_pixel_dimensions(int width, int height);
226   virtual void set_video_display_width(int width);
227   virtual void set_video_display_height(int height);
228   virtual void set_video_display_unit(int unit);
229   virtual void set_video_display_dimensions(int width, int height, int unit, option_source_e source);
230   virtual void set_video_aspect_ratio(double aspect_ratio, bool is_factor, option_source_e source);
231   virtual void set_video_pixel_cropping(int left, int top, int right, int bottom, option_source_e source);
232   virtual void set_video_pixel_cropping(const pixel_crop_t &cropping, option_source_e source);
233   virtual void set_video_colour_matrix(int matrix_index, option_source_e source);
234   virtual void set_video_bits_per_channel(int num_bits, option_source_e source);
235   virtual void set_video_chroma_subsample(chroma_subsample_t const &subsample, option_source_e source);
236   virtual void set_video_cb_subsample(cb_subsample_t const &subsample, option_source_e source);
237   virtual void set_video_chroma_siting(chroma_siting_t const &siting, option_source_e source);
238   virtual void set_video_colour_range(int range, option_source_e source);
239   virtual void set_video_colour_transfer_character(int transfer_index, option_source_e source);
240   virtual void set_video_colour_primaries(int primary_index, option_source_e source);
241   virtual void set_video_max_cll(int max_cll, option_source_e source);
242   virtual void set_video_max_fall(int max_fall, option_source_e source);
243   virtual void set_video_chroma_coordinates(chroma_coordinates_t const &coordinates, option_source_e source);
244   virtual void set_video_white_colour_coordinates(white_colour_coordinates_t const &coordinates, option_source_e source);
245   virtual void set_video_max_luminance(double max, option_source_e source);
246   virtual void set_video_min_luminance(double min, option_source_e source);
247   virtual void set_video_projection_type(uint64_t value, option_source_e source);
248   virtual void set_video_projection_private(memory_cptr const &value, option_source_e source);
249   virtual void set_video_projection_pose_yaw(double value, option_source_e source);
250   virtual void set_video_projection_pose_pitch(double value, option_source_e source);
251   virtual void set_video_projection_pose_roll(double value, option_source_e source);
252   virtual void set_video_field_order(uint64_t order, option_source_e source);
253   virtual void set_video_stereo_mode(stereo_mode_c::mode stereo_mode, option_source_e source);
254   virtual void set_video_stereo_mode_impl(libebml::EbmlMaster &video, stereo_mode_c::mode stereo_mode);
255 
256   virtual void set_block_addition_mappings(std::vector<block_addition_mapping_t> const &mappings);
257 
258   virtual void set_tag_track_uid();
259 
260   virtual void set_track_name(const std::string &name);
261 
set_default_compression_method(compression_method_e method)262   virtual void set_default_compression_method(compression_method_e method) {
263     if (COMPRESSION_UNSPECIFIED == m_hcompression)
264       m_hcompression = method;
265   }
266 
267   virtual void set_video_colour_space(memory_cptr const &value, option_source_e source);
268 
269   virtual void force_duration_on_last_packet();
270 
271   virtual translatable_string_c get_format_name() const = 0;
272   virtual split_result_e can_be_split(std::string &error_message);
273   virtual connection_result_e can_connect_to(generic_packetizer_c *src, std::string &error_message) = 0;
274   virtual void connect(generic_packetizer_c *src, int64_t append_timestamp_offset = -1);
275 
enable_avi_audio_sync(bool enable)276   virtual void enable_avi_audio_sync(bool enable) {
277     m_ti.m_avi_audio_sync_enabled = enable;
278   }
279   virtual int64_t calculate_avi_audio_sync(int64_t num_bytes, int64_t samples_per_packet, int64_t packet_duration);
280   virtual void set_displacement_maybe(int64_t displacement);
281 
282   virtual void apply_factory();
283   virtual void apply_factory_once(packet_cptr const &packet);
284   virtual void apply_factory_short_queueing(packet_cptr_di &p_start);
285   virtual void apply_factory_full_queueing(packet_cptr_di &p_start);
286 
287   virtual bool display_dimensions_or_aspect_ratio_set();
288 
289   virtual bool is_compatible_with(output_compatibility_e compatibility);
290 
291   int64_t create_track_number();
292 
293   virtual void prevent_lacing();
294   virtual bool is_lacing_prevented() const;
295 
296   virtual generic_packetizer_c *get_connected_successor() const;
297 
298   virtual void set_source_id(std::string const &source_id);
299   virtual std::string get_source_id() const;
300 
301   // Callbacks
302   virtual void after_packet_timestamped(packet_t &packet);
303   virtual void after_packet_rendered(packet_t const &packet);
304   virtual void before_file_finished();
305   virtual void after_file_created();
306 
307 protected:
308   virtual void process_impl(packet_cptr const &packet) = 0;
flush_impl()309   virtual void flush_impl() {
310   };
311 
312   virtual void show_experimental_status_version(std::string const &codec_id);
313 
314   virtual void compress_packet(packet_t &packet);
315   virtual void account_enqueued_bytes(packet_t &packet, int64_t factor);
316 
317   virtual void apply_block_addition_mappings();
318 };
319 
320 extern std::vector<generic_packetizer_c *> ptzrs_in_header_order;
321