aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDaniil Cherednik <dan.cherednik@gmail.com>2016-03-08 01:45:38 +0300
committerDaniil Cherednik <dan.cherednik@gmail.com>2016-03-08 01:45:38 +0300
commitf2c1a3777190d00730d0ba3986998d7c799dc0c1 (patch)
treed89db86d2124b4fb52b221f04549800d46af09c6 /src
parente06cd5d38bfc4fc2722be227d14b47e68a6e7367 (diff)
downloadatracdenc-f2c1a3777190d00730d0ba3986998d7c799dc0c1.tar.gz
a bit more generic TScaler
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/atrac/atrac1.h1
-rw-r--r--src/atrac/atrac1_bitalloc.cpp2
-rw-r--r--src/atrac/atrac1_bitalloc.h3
-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.h4
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);