diff options
author | Daniil Cherednik <dan.cherednik@gmail.com> | 2016-03-08 01:45:38 +0300 |
---|---|---|
committer | Daniil Cherednik <dan.cherednik@gmail.com> | 2016-03-08 01:45:38 +0300 |
commit | f2c1a3777190d00730d0ba3986998d7c799dc0c1 (patch) | |
tree | d89db86d2124b4fb52b221f04549800d46af09c6 /src | |
parent | e06cd5d38bfc4fc2722be227d14b47e68a6e7367 (diff) | |
download | atracdenc-f2c1a3777190d00730d0ba3986998d7c799dc0c1.tar.gz |
a bit more generic TScaler
Diffstat (limited to 'src')
-rw-r--r-- | src/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/atrac/atrac1.h | 1 | ||||
-rw-r--r-- | src/atrac/atrac1_bitalloc.cpp | 2 | ||||
-rw-r--r-- | src/atrac/atrac1_bitalloc.h | 3 | ||||
-rw-r--r-- | src/atrac/atrac_scale.cpp (renamed from src/atrac/atrac1_scale.cpp) | 30 | ||||
-rw-r--r-- | src/atrac/atrac_scale.h (renamed from src/atrac/atrac1_scale.h) | 15 | ||||
-rw-r--r-- | src/atracdenc.h | 4 |
7 files changed, 27 insertions, 30 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5299e95..3fc1d11 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -13,7 +13,7 @@ find_package(libsndfile REQUIRED) include_directories(${LIBSNDFILE_INCLUDE_DIR}) set(SOURCE_LIB mdct/vorbis_impl/mdct.c) -set(SOURCE_EXE main.cpp wav.cpp aea.cpp transient_detector.cpp atracdenc.cpp bitstream/bitstream.cpp atrac/atrac1.cpp atrac/atrac1_dequantiser.cpp atrac/atrac1_scale.cpp atrac/atrac1_bitalloc.cpp) +set(SOURCE_EXE main.cpp wav.cpp aea.cpp transient_detector.cpp atracdenc.cpp bitstream/bitstream.cpp atrac/atrac1.cpp atrac/atrac1_dequantiser.cpp atrac/atrac_scale.cpp atrac/atrac1_bitalloc.cpp) add_library(mdct_impl STATIC ${SOURCE_LIB}) add_executable(atracdenc ${SOURCE_EXE}) diff --git a/src/atrac/atrac1.h b/src/atrac/atrac1.h index 37241f6..cb0df1f 100644 --- a/src/atrac/atrac1.h +++ b/src/atrac/atrac1.h @@ -31,6 +31,7 @@ protected: static const uint32_t BitsPerIDWL = 4; static const uint32_t BitsPerIDSF = 6; static const uint32_t NumSamples = 512; + static const uint8_t NumQMF = QMF_BANDS; static double ScaleTable[64]; static double SineWindow[32]; diff --git a/src/atrac/atrac1_bitalloc.cpp b/src/atrac/atrac1_bitalloc.cpp index 0f5b68f..68af205 100644 --- a/src/atrac/atrac1_bitalloc.cpp +++ b/src/atrac/atrac1_bitalloc.cpp @@ -1,5 +1,5 @@ #include "atrac1_bitalloc.h" -#include "atrac1_scale.h" +#include "atrac_scale.h" #include "atrac1.h" #include <math.h> #include <cassert> diff --git a/src/atrac/atrac1_bitalloc.h b/src/atrac/atrac1_bitalloc.h index 1188263..ce7b6fb 100644 --- a/src/atrac/atrac1_bitalloc.h +++ b/src/atrac/atrac1_bitalloc.h @@ -1,5 +1,5 @@ #pragma once -#include "atrac1_scale.h" +#include "atrac_scale.h" #include "../bitstream/bitstream.h" #include "../aea.h" #include "../atrac/atrac1.h" @@ -8,6 +8,7 @@ #include <cstdint> namespace NAtrac1 { +using NAtracDEnc::TScaledBlock; class IAtrac1BitAlloc { public: diff --git a/src/atrac/atrac1_scale.cpp b/src/atrac/atrac_scale.cpp index 627513a..1e24cb5 100644 --- a/src/atrac/atrac1_scale.cpp +++ b/src/atrac/atrac_scale.cpp @@ -1,34 +1,23 @@ -#include "atrac1_scale.h" +#include "atrac_scale.h" +#include "atrac1.h" #include <cmath> #include <iostream> #include <algorithm> -namespace NAtrac1 { +namespace NAtracDEnc { using std::vector; using std::map; using namespace std; -map<double, uint8_t> TScaler::ScaleIndex; static const uint32_t MAX_SCALE = 65536; -static bool absComp(double a, double b) { - return abs(a) < abs(b); -} - -TScaler::TScaler() { - if (ScaleIndex.empty()) { - for (int i = 0; i < 64; i++) { - ScaleIndex[ScaleTable[i]] = i; - } - } -} - -vector<TScaledBlock> TScaler::Scale(const vector<double>& specs, const TBlockSize& blockSize) { +template<class TBaseData> +vector<TScaledBlock> TScaler<TBaseData>::Scale(const vector<double>& specs, const TBlockSize& blockSize) { vector<TScaledBlock> scaledBlocks; - for (uint8_t bandNum = 0; bandNum < QMF_BANDS; ++bandNum) { + for (uint8_t bandNum = 0; bandNum < this->NumQMF; ++bandNum) { const bool shortWinMode = !!blockSize.LogCount[bandNum]; - for (uint8_t blockNum = BlocksPerBand[bandNum]; blockNum < BlocksPerBand[bandNum + 1]; ++blockNum) { - const uint16_t specNumStart = shortWinMode ? SpecsStartShort[blockNum] : SpecsStartLong[blockNum]; - const uint16_t specNumEnd = specNumStart + SpecsPerBlock[blockNum]; + for (uint8_t blockNum = this->BlocksPerBand[bandNum]; blockNum < this->BlocksPerBand[bandNum + 1]; ++blockNum) { + const uint16_t specNumStart = shortWinMode ? this->SpecsStartShort[blockNum] : this->SpecsStartLong[blockNum]; + const uint16_t specNumEnd = specNumStart + this->SpecsPerBlock[blockNum]; double maxAbsSpec = 0; for (uint16_t curSpec = specNumStart; curSpec < specNumEnd; ++curSpec) { const double absSpec = abs(specs[curSpec]); @@ -55,4 +44,5 @@ vector<TScaledBlock> TScaler::Scale(const vector<double>& specs, const TBlockSiz } return scaledBlocks; } +template class TScaler<TAtrac1Data>; } diff --git a/src/atrac/atrac1_scale.h b/src/atrac/atrac_scale.h index 0a0e852..dd437a2 100644 --- a/src/atrac/atrac1_scale.h +++ b/src/atrac/atrac_scale.h @@ -4,8 +4,7 @@ #include <cstdint> #include "atrac1.h" - -namespace NAtrac1 { +namespace NAtracDEnc { struct TScaledBlock { TScaledBlock(uint8_t sfi) : ScaleFactorIndex(sfi) {} @@ -13,10 +12,16 @@ struct TScaledBlock { std::vector<double> Values; }; -class TScaler : public TAtrac1Data { - static std::map<double, uint8_t>ScaleIndex; +template <class TBaseData> +class TScaler : public TBaseData { + std::map<double, uint8_t>ScaleIndex; public: - TScaler(); + TScaler() { + for (int i = 0; i < 64; i++) { + ScaleIndex[TBaseData::ScaleTable[i]] = i; + } + } std::vector<TScaledBlock> Scale(const std::vector<double>& specs, const TBlockSize& blockSize); }; + } diff --git a/src/atracdenc.h b/src/atracdenc.h index eb2f670..30dbd20 100644 --- a/src/atracdenc.h +++ b/src/atracdenc.h @@ -5,7 +5,7 @@ #include "transient_detector.h" #include "atrac/atrac1.h" #include "atrac/atrac1_qmf.h" -#include "atrac/atrac1_scale.h" +#include "atrac/atrac_scale.h" #include "mdct/mdct.h" #include <assert.h> @@ -76,7 +76,7 @@ class TAtrac1Processor : public IProcessor<double>, public TAtrac1MDCT, public v }; TAtrac1Processor::TTransientDetectors TransientDetectors; - NAtrac1::TScaler Scaler; + TScaler<TAtrac1Data> Scaler; public: TAtrac1Processor(TAeaPtr&& aea, TAtrac1EncodeSettings&& settings); |