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