Commit cd4256b9 authored by Stefan Westerfeld's avatar Stefan Westerfeld

Cleanup clip decoder padding code.

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent 6f378c0f
......@@ -652,6 +652,8 @@ public:
class ClipDecoder
{
const int frames_per_block = 0;
void
run_padded (const WavData& l_wav_data, ResultSet& result_set, double time_offset_sec)
{
......@@ -695,13 +697,47 @@ class ClipDecoder
}
}
}
enum class Pos { START, END };
void
run_block (const WavData& wav_data, ResultSet& result_set, int pad_frames_start, int pad_frames_end, Pos pos)
{
double time_offset;
vector<float> ext_samples;
const size_t n = (frames_per_block + 5) * Params::frame_size * wav_data.n_channels();
if (pos == Pos::START)
{
ext_samples = wav_data.samples();
if (ext_samples.size() > n)
ext_samples.resize (n);
time_offset = 0;
}
else // (pos == Pos::END)
{
auto s = wav_data.samples();
if (n > s.size())
return;
ext_samples.assign (s.end() - n, s.end());
time_offset = double (s.size() - n) / wav_data.sample_rate() / wav_data.n_channels();
}
// printf ("%d: %f..%f\n", int (pos), time_offset, time_offset + double (ext_samples.size()) / wav_data.sample_rate() / wav_data.n_channels());
ext_samples.insert (ext_samples.begin(), pad_frames_start * Params::frame_size * wav_data.n_channels(), 0);
ext_samples.insert (ext_samples.end(), pad_frames_end * Params::frame_size * wav_data.n_channels(), 0);
WavData l_wav_data (ext_samples, wav_data.n_channels(), wav_data.sample_rate(), wav_data.bit_depth());
run_padded (l_wav_data, result_set, time_offset);
}
public:
ClipDecoder() :
frames_per_block (mark_sync_frame_count() + mark_data_frame_count())
{
}
void
run (const WavData& wav_data, ResultSet& result_set)
{
// L-blocks
const int wav_frames = wav_data.n_values() / (Params::frame_size * wav_data.n_channels());
const int frames_per_block = mark_sync_frame_count() + mark_data_frame_count();
if (wav_frames < frames_per_block * 3.1) /* clip decoder is only used for small wavs */
{
// clip decoder padding at start:
......@@ -710,41 +746,8 @@ public:
// - 5 extra frames as safety
const int pad_frames_start = max (frames_per_block, frames_per_block * 2 - wav_frames) + 5;
// clip decoder padding at end:
// - one data block + 5 extra frames as safety
// for short clips, the sync pattern of the data block repeats after one block length
const int pad_frames_end = frames_per_block + 5;
// truncate to one data block
const int max_frames = (frames_per_block + 5) * Params::frame_size * wav_data.n_channels();
auto ext_samples = wav_data.samples();
if (ext_samples.size() > max_frames)
ext_samples.resize (max_frames);
printf ("START: %f..%f\n", 0.0, double (ext_samples.size()) / wav_data.sample_rate() / wav_data.n_channels());
ext_samples.insert (ext_samples.begin(), pad_frames_start * Params::frame_size * wav_data.n_channels(), 0);
ext_samples.insert (ext_samples.end(), pad_frames_end * Params::frame_size * wav_data.n_channels(), 0);
WavData l_wav_data (ext_samples, wav_data.n_channels(), wav_data.sample_rate(), wav_data.bit_depth());
run_padded (l_wav_data, result_set, 0);
if (wav_data.samples().size() > max_frames)
{
int pad_frames_start = frames_per_block + 5;
int pad_frames_end = frames_per_block + 5;
size_t n = (frames_per_block + 5) * Params::frame_size * wav_data.n_channels();
auto s = wav_data.samples();
ext_samples.assign (s.end() - n, s.end());
printf ("END: %f..%f\n", double (s.size() - n) / wav_data.sample_rate() / wav_data.n_channels(),
double (s.size()) / wav_data.sample_rate() / wav_data.n_channels());
ext_samples.insert (ext_samples.begin(), pad_frames_start * Params::frame_size * wav_data.n_channels(), 0);
ext_samples.insert (ext_samples.end(), pad_frames_end * Params::frame_size * wav_data.n_channels(), 0);
WavData l_wav_data (ext_samples, wav_data.n_channels(), wav_data.sample_rate(), wav_data.bit_depth());
run_padded (l_wav_data, result_set, double (s.size() - n) / wav_data.sample_rate() / wav_data.n_channels());
}
run_block (wav_data, result_set, pad_frames_start, frames_per_block + 5, Pos::START);
run_block (wav_data, result_set, frames_per_block + 5, frames_per_block + 5, Pos::END);
}
}
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment