PCM packetizer: don't copy packaged if they're too small

This commit is contained in:
Moritz Bunkus 2013-06-28 22:21:07 +02:00
parent e9ac1997e0
commit 7bcee3ce43
5 changed files with 19 additions and 19 deletions

View File

@ -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

View File

@ -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);
}

View File

@ -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);

View File

@ -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<size_t>(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<double>(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());

View File

@ -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);