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