mirror of
https://gitlab.com/mbunkus/mkvtoolnix.git
synced 2025-02-26 08:22:31 +00:00
PCM packetizer: don't copy packaged if they're too small
This commit is contained in:
parent
e9ac1997e0
commit
7bcee3ce43
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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());
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user