From bf4da2fb36103787628468b0e652c64c17d5c707 Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Sun, 27 Aug 2023 18:23:05 +0200 Subject: [PATCH] Specialized segmenters for typical PCM audio granularities These are significantly faster (20-35%) than the variable granularity segmenter. --- src/dwarfs/segmenter.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/dwarfs/segmenter.cpp b/src/dwarfs/segmenter.cpp index 0ad9df56..4b669a9b 100644 --- a/src/dwarfs/segmenter.cpp +++ b/src/dwarfs/segmenter.cpp @@ -1237,12 +1237,30 @@ create_segmenter2(logger& lgr, progress& prog, segmenter::config const& cfg, compression_constraints const& cc, size_t total_size, segmenter::block_ready_cb block_ready) { - if (!cc.granularity || cc.granularity.value() == 1) { + uint32_t granularity = cc.granularity ? cc.granularity.value() : 1; + + auto make_const_granularity_segmenter = [&]() { return make_unique_logging_object< segmenter::impl, - constant_granularity_segmenter_::template type, + constant_granularity_segmenter_::template type, logger_policies>(lgr, prog, std::move(blkmgr), cfg, total_size, std::move(block_ready)); + }; + + switch (granularity) { + case 1: + return make_const_granularity_segmenter.template operator()<1>(); + case 2: // 16-bit mono PCM audio + return make_const_granularity_segmenter.template operator()<2>(); + case 3: // 24-bit mono PCM audio + return make_const_granularity_segmenter.template operator()<3>(); + case 4: // 16-bit stereo PCM audio + return make_const_granularity_segmenter.template operator()<4>(); + case 6: // 24-bit stereo PCM audio + return make_const_granularity_segmenter.template operator()<6>(); + default: + break; } return make_unique_logging_object<