aboutsummaryrefslogtreecommitdiffstats
path: root/src/atrac3denc.cpp
diff options
context:
space:
mode:
authorDaniil Cherednik <dan.cherednik@gmail.com>2018-12-05 00:14:29 +0300
committerDaniil Cherednik <dan.cherednik@gmail.com>2018-12-05 00:14:29 +0300
commitb2342e902d62067fda5a08c7cccff62ee3619fc5 (patch)
tree226144be966246d69244a6440e485b1bf46a84e5 /src/atrac3denc.cpp
parentd8014b6a75086decf99526d1538a172b527536e5 (diff)
downloadatracdenc-b2342e902d62067fda5a08c7cccff62ee3619fc5.tar.gz
[atrac3] Remove tonal extraction code
Current implementation doesn't add notisible quality improvements, but often adds artifacts due to tonal bit allocation penalty. Proper implementation must use tonal component only if penalty of tonal allocation less than gain generic bit allocation.
Diffstat (limited to 'src/atrac3denc.cpp')
-rw-r--r--src/atrac3denc.cpp81
1 files changed, 1 insertions, 80 deletions
diff --git a/src/atrac3denc.cpp b/src/atrac3denc.cpp
index 85b0c31..519cd9b 100644
--- a/src/atrac3denc.cpp
+++ b/src/atrac3denc.cpp
@@ -129,61 +129,6 @@ TAtrac3MDCT::TGainModulatorArray TAtrac3MDCT::MakeGainModulatorArray(const TAtra
}
}
-//TODO:
-TAtrac3Data::TTonalComponents TAtrac3Processor::ExtractTonalComponents(TFloat* specs, TTonalDetector fn)
-{
- TAtrac3Data::TTonalComponents res;
- const float thresholds[TAtrac3Data::NumQMF] = { 16, 2.4, 2.8, 3.2 };
- for (uint8_t bandNum = 0; bandNum < this->NumQMF; ++bandNum) {
- //disable for frequence above 16KHz until we works without proper psy
- if (bandNum)
- continue;
- for (uint8_t blockNum = BlocksPerBand[bandNum]; blockNum < BlocksPerBand[bandNum + 1]; ++blockNum) {
- const uint16_t specNumStart = SpecsStartLong[blockNum];
- const uint16_t specNumEnd = specNumStart + SpecsPerBlock[blockNum];
- float level = fn(specs + specNumStart, SpecsPerBlock[blockNum]);
- if (!std::isnan(level)) {
- for (uint16_t n = specNumStart; n < specNumEnd; ++n) {
- //TODO:
- TFloat absValue = std::abs(specs[n]);
- //std::cerr << n << " " << absValue << " " << level << std::endl;
- if (absValue > 0.999999) {
- TFloat shift = (specs[n] > 0) ? 0.999999 : -0.999999;
- std::cerr << "overflow: " << specs[n] << " at: " << n << std::endl;
- //res.push_back({n, specs[n] - shift});
- specs[n] = shift;
- } else if (std::abs(specs[n]) / level > thresholds[bandNum]) {
- res.push_back({n, specs[n]/* - level*/, blockNum});
- specs[n] = 0;//level;
- }
-
- }
-
- }
- }
- }
- return res;
-}
-
-void TAtrac3Processor::MapTonalComponents(const TTonalComponents& tonalComponents, vector<TTonalBlock>* componentMap)
-{
- for (uint16_t i = 0; i < tonalComponents.size();) {
- const uint16_t startPos = i;
- uint16_t curPos;
- do {
- curPos = tonalComponents[i].Pos;
- ++i;
- } while ( i < tonalComponents.size() && tonalComponents[i].Pos == curPos + 1 && i - startPos < 7);
- const uint16_t len = i - startPos;
- TFloat tmp[8];
- for (uint8_t j = 0; j < len; ++j)
- tmp[j] = tonalComponents[startPos + j].Val;
- const TScaledBlock& scaledBlock = Scaler.Scale(tmp, len);
- componentMap->push_back({&tonalComponents[startPos], scaledBlock});
- }
-}
-
-
TFloat TAtrac3Processor::LimitRel(TFloat x)
{
return std::min(std::max(x, GainLevel[15]), GainLevel[0]);
@@ -342,10 +287,6 @@ TPCMEngine<TFloat>::TProcessLambda TAtrac3Processor::GetEncodeLambda()
return [this, bitStreamWriter](TFloat* data, const TPCMEngine<TFloat>::ProcessMeta& meta) {
using TSce = TAtrac3BitStreamWriter::TSingleChannelElement;
- // TTonalBlock has pointer to the TTonalVal so TTonalComponents must be avaliable
- // TODO: this code should be rewritten
- TTonalComponents tonals[2];
-
assert(SingleChannelElements.size() == meta.Channels);
for (uint32_t channel = 0; channel < SingleChannelElements.size(); channel++) {
vector<TFloat> specs(1024);
@@ -375,28 +316,8 @@ TPCMEngine<TFloat>::TProcessLambda TAtrac3Processor::GetEncodeLambda()
Mdct(specs.data(), p, maxOverlapLevels, MakeGainModulatorArray(sce->SubbandInfo));
}
- tonals[channel] = Params.NoTonalComponents ?
- TAtrac3Data::TTonalComponents() : ExtractTonalComponents(specs.data(), [](const TFloat* spec, uint16_t len) {
- std::vector<TFloat> magnitude(len);
- //TFloat s = 0.0;
- for (uint16_t i = 0; i < len; ++i) {
- magnitude[i] = std::abs(spec[i]);
- // s += magnitude[i];
- }
- float median = CalcMedian(magnitude.data(), len);
- for (uint16_t i = 0; i < len; ++i) {
- if (median > 0.000015) {
- return median;
- }
- }
- return NAN;
- });
-
- sce->TonalBlocks.clear();
- MapTonalComponents(tonals[channel], &sce->TonalBlocks);
-
//TBlockSize for ATRAC3 - 4 subband, all are long (no short window)
- sce->ScaledBlocks = std::move(Scaler.ScaleFrame(specs, TBlockSize()));
+ sce->ScaledBlocks = Scaler.ScaleFrame(specs, TBlockSize());
}