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 PCM output module 10 11 Written by Moritz Bunkus <moritz@bunkus.org>. 12 */ 13 14 #pragma once 15 16 #include "common/common_pch.h" 17 18 #include "common/byte_buffer.h" 19 #include "common/samples_to_timestamp_converter.h" 20 #include "merge/generic_packetizer.h" 21 22 class pcm_packetizer_c: public generic_packetizer_c { 23 public: 24 enum pcm_format_e { 25 little_endian_integer = 0, 26 big_endian_integer = 1, 27 ieee_float = 2 28 }; 29 30 private: 31 int m_samples_per_sec, m_channels, m_bits_per_sample, m_samples_per_packet, m_samples_per_packet_packaged; 32 size_t m_packet_size, m_min_packet_size, m_samples_output, m_num_durations_provided, m_num_packets_with_different_sample_count; 33 pcm_format_e m_format; 34 mtx::bytes::buffer_c m_buffer; 35 samples_to_timestamp_converter_c m_s2ts; 36 std::function<void(unsigned char const *, unsigned char *, std::size_t)> m_byte_swapper; 37 38 public: 39 pcm_packetizer_c(generic_reader_c *p_reader, track_info_c &p_ti, int p_samples_per_sec, int channels, int bits_per_sample, pcm_format_e format = little_endian_integer); 40 virtual ~pcm_packetizer_c(); 41 42 virtual void set_headers(); 43 get_format_name()44 virtual translatable_string_c get_format_name() const { 45 return YT("PCM"); 46 } 47 virtual connection_result_e can_connect_to(generic_packetizer_c *src, std::string &error_message); 48 49 protected: 50 virtual void process_impl(packet_cptr const &packet) override; 51 virtual void process_packaged(packet_cptr const &packet); 52 virtual void flush_impl(); 53 virtual void flush_packets(); 54 virtual int64_t size_to_samples(int64_t size) const; 55 virtual int64_t samples_to_size(int64_t size) const; 56 virtual void byte_swap_data(memory_c &data) const; 57 }; 58