19 std::uint64_t input_frames,
21 std::uint64_t output_frames,
22 const std::vector<double>& coefficients)
noexcept {
23 if (input ==
nullptr || output ==
nullptr || input_frames == 0 ||
24 coefficients.empty() || (coefficients.size() & 1u) == 0u) {
27 const auto radius =
static_cast<std::int64_t
>(coefficients.size() / 2);
28 const auto last =
static_cast<std::int64_t
>(input_frames - 1);
29 for (std::uint64_t frame = 0; frame < output_frames; ++frame) {
30 const auto center =
static_cast<std::int64_t
>(frame * 2);
31 double sum =
static_cast<double>(input[std::clamp(
32 center, std::int64_t{0}, last)]) * coefficients[
static_cast<std::size_t
>(radius)];
33 for (std::int64_t tap = 1; tap <= radius; ++tap) {
34 const auto before = std::clamp(center - tap, std::int64_t{0}, last);
35 const auto after = std::clamp(center + tap, std::int64_t{0}, last);
36 sum += (
static_cast<double>(input[before]) +
37 static_cast<double>(input[after])) *
38 coefficients[
static_cast<std::size_t
>(radius + tap)];
40 output[frame] =
static_cast<float>(sum);
void decimate_sample_mip_2x(const float *input, std::uint64_t input_frames, float *output, std::uint64_t output_frames, const std::vector< double > &coefficients) noexcept
Definition sample_mip_builder.hpp:18