From 7bcee3ce435b7099b93dd0291fc0d19a89b1f448 Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Fri, 28 Jun 2013 22:21:07 +0200 Subject: [PATCH] PCM packetizer: don't copy packaged if they're too small --- src/input/r_avi.cpp | 2 +- src/input/r_matroska.cpp | 2 +- src/input/r_wav.cpp | 2 +- src/output/p_pcm.cpp | 19 ++++++------------- src/output/p_pcm.h | 13 ++++++++++--- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/input/r_avi.cpp b/src/input/r_avi.cpp index 00884c059..7cb341be1 100644 --- a/src/input/r_avi.cpp +++ b/src/input/r_avi.cpp @@ -481,7 +481,7 @@ avi_reader_c::add_audio_demuxer(int aid) { switch(audio_format) { case 0x0001: // raw PCM audio case 0x0003: // raw PCM audio (float) - packetizer = new pcm_packetizer_c(this, m_ti, demuxer.m_samples_per_second, demuxer.m_channels, demuxer.m_bits_per_sample, audio_format == 0x0003); + packetizer = new pcm_packetizer_c(this, m_ti, demuxer.m_samples_per_second, demuxer.m_channels, demuxer.m_bits_per_sample, 0x0003 == audio_format ? pcm_packetizer_c::ieee_float : pcm_packetizer_c::little_endian_integer); break; case 0x0050: // MP2 diff --git a/src/input/r_matroska.cpp b/src/input/r_matroska.cpp index e18c06302..f7d831fe5 100644 --- a/src/input/r_matroska.cpp +++ b/src/input/r_matroska.cpp @@ -1498,7 +1498,7 @@ kax_reader_c::create_opus_audio_packetizer(kax_track_t *t, void kax_reader_c::create_pcm_audio_packetizer(kax_track_t *t, track_info_c &nti) { - set_track_packetizer(t, new pcm_packetizer_c(this, nti, t->a_sfreq, t->a_channels, t->a_bps, 0x0003 == t->a_formattag)); + set_track_packetizer(t, new pcm_packetizer_c(this, nti, t->a_sfreq, t->a_channels, t->a_bps, 0x0003 == t->a_formattag ? pcm_packetizer_c::ieee_float : pcm_packetizer_c::little_endian_integer)); show_packetizer_info(t->tnum, t->ptzr_ptr); } diff --git a/src/input/r_wav.cpp b/src/input/r_wav.cpp index b3b7ee10b..ccac351ae 100644 --- a/src/input/r_wav.cpp +++ b/src/input/r_wav.cpp @@ -403,7 +403,7 @@ wav_pcm_demuxer_c::create_packetizer() { get_uint32_le(&m_wheader->common.dwSamplesPerSec), get_uint16_le(&m_wheader->common.wChannels), get_uint16_le(&m_wheader->common.wBitsPerSample), - ieee_float); + ieee_float ? pcm_packetizer_c::ieee_float : pcm_packetizer_c::little_endian_integer); show_packetizer_info(0, m_ptzr); diff --git a/src/output/p_pcm.cpp b/src/output/p_pcm.cpp index a4c3613c0..8b09929c4 100644 --- a/src/output/p_pcm.cpp +++ b/src/output/p_pcm.cpp @@ -25,14 +25,15 @@ pcm_packetizer_c::pcm_packetizer_c(generic_reader_c *p_reader, int samples_per_sec, int channels, int bits_per_sample, - bool ieee_float) + pcm_format_e format) : generic_packetizer_c(p_reader, p_ti) , m_samples_per_sec(samples_per_sec) , m_channels(channels) , m_bits_per_sample(bits_per_sample) , m_packet_size(0) + , m_min_packet_size{static_cast(samples_per_sec * channels * bits_per_sample * 4 / 1000 / 8)} // Minimum: 4ms of samples if we should pass it through unmodified , m_samples_output(0) - , m_ieee_float(ieee_float) + , m_format{format} , m_s2tc(1000000000ll, m_samples_per_sec) { @@ -60,16 +61,8 @@ pcm_packetizer_c::~pcm_packetizer_c() { void pcm_packetizer_c::set_headers() { - if (m_ieee_float) - set_codec_id(MKV_A_PCM_FLOAT); - - else if (big_endian) - set_codec_id(MKV_A_PCM_BE); - - else - set_codec_id(MKV_A_PCM); - - set_audio_sampling_freq((float)m_samples_per_sec); + set_codec_id(ieee_float == m_format ? MKV_A_PCM_FLOAT : MKV_A_PCM); + set_audio_sampling_freq(static_cast(m_samples_per_sec)); set_audio_channels(m_channels); set_audio_bit_depth(m_bits_per_sample); @@ -78,7 +71,7 @@ pcm_packetizer_c::set_headers() { int pcm_packetizer_c::process(packet_cptr packet) { - if (packet->has_timecode()) + if (packet->has_timecode() && (packet->data->get_size() >= m_min_packet_size)) return process_packaged(packet); m_buffer.add(packet->data->get_buffer(), packet->data->get_size()); diff --git a/src/output/p_pcm.h b/src/output/p_pcm.h index 2bcf107f7..64ceacc2f 100644 --- a/src/output/p_pcm.h +++ b/src/output/p_pcm.h @@ -21,15 +21,22 @@ #include "merge/pr_generic.h" class pcm_packetizer_c: public generic_packetizer_c { +public: + enum pcm_format_e { + little_endian_integer = 0, + big_endian_integer = 1, + ieee_float = 2 + }; + private: int m_samples_per_sec, m_channels, m_bits_per_sample, m_samples_per_packet; - size_t m_packet_size, m_samples_output; - bool m_ieee_float; + size_t m_packet_size, m_min_packet_size, m_samples_output; + pcm_format_e m_format; byte_buffer_c m_buffer; samples_to_timecode_converter_c m_s2tc; public: - pcm_packetizer_c(generic_reader_c *p_reader, track_info_c &p_ti, int p_samples_per_sec, int channels, int bits_per_sample, bool ieee_float = false); + 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); virtual ~pcm_packetizer_c(); virtual int process(packet_cptr packet);