aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDaniil Cherednik <dan.cherednik@gmail.com>2025-07-21 22:39:37 +0200
committerGitHub <noreply@github.com>2025-07-21 22:39:37 +0200
commite9eb8305dcdbdbf5a9cbabf766c6e908e63a19b1 (patch)
tree0ec04711cfc260fd40554b78510975142e714e11 /src
parentba996d09e9c9cb6b296912da630726cb2ce284b5 (diff)
downloadatracdenc-e9eb8305dcdbdbf5a9cbabf766c6e908e63a19b1.tar.gz
Clean qmf code. (#51)
- Remove unused TQmf template pcm type parameter - Do not copy buffer twice in the synthesis fb
Diffstat (limited to 'src')
-rw-r--r--src/atrac/atrac1_qmf.h19
-rw-r--r--src/atrac/atrac3_qmf.h11
-rw-r--r--src/atrac1denc.h4
-rw-r--r--src/atrac3denc.h2
-rw-r--r--src/qmf/qmf.h27
5 files changed, 29 insertions, 34 deletions
diff --git a/src/atrac/atrac1_qmf.h b/src/atrac/atrac1_qmf.h
index 0276160..9f6d5ae 100644
--- a/src/atrac/atrac1_qmf.h
+++ b/src/atrac/atrac1_qmf.h
@@ -22,20 +22,19 @@
namespace NAtracDEnc {
-template<class TIn>
class Atrac1AnalysisFilterBank {
const static int nInSamples = 512;
const static int delayComp = 39;
- TQmf<TIn, nInSamples> Qmf1;
- TQmf<TIn, nInSamples / 2> Qmf2;
+ TQmf<nInSamples> Qmf1;
+ TQmf<nInSamples / 2> Qmf2;
std::vector<float> MidLowTmp;
std::vector<float> DelayBuf;
public:
- Atrac1AnalysisFilterBank() {
+ Atrac1AnalysisFilterBank() noexcept {
MidLowTmp.resize(512);
DelayBuf.resize(delayComp + 512);
}
- void Analysis(TIn* pcm, float* low, float* mid, float* hi) {
+ void Analysis(const float* pcm, float* low, float* mid, float* hi) noexcept {
memcpy(&DelayBuf[0], &DelayBuf[256], sizeof(float) * delayComp);
Qmf1.Analysis(pcm, &MidLowTmp[0], &DelayBuf[delayComp]);
Qmf2.Analysis(&MidLowTmp[0], low, mid);
@@ -43,20 +42,20 @@ public:
}
};
-template<class TOut>
+
class Atrac1SynthesisFilterBank {
const static int nInSamples = 512;
const static int delayComp = 39;
- TQmf<TOut, nInSamples> Qmf1;
- TQmf<TOut, nInSamples / 2> Qmf2;
+ TQmf<nInSamples> Qmf1;
+ TQmf<nInSamples / 2> Qmf2;
std::vector<float> MidLowTmp;
std::vector<float> DelayBuf;
public:
- Atrac1SynthesisFilterBank() {
+ Atrac1SynthesisFilterBank() noexcept {
MidLowTmp.resize(512);
DelayBuf.resize(delayComp + 512);
}
- void Synthesis(TOut* pcm, float* low, float* mid, float* hi) {
+ void Synthesis(float* pcm, const float* low, const float* mid, const float* hi) noexcept {
memcpy(&DelayBuf[0], &DelayBuf[256], sizeof(float) * delayComp);
memcpy(&DelayBuf[delayComp], hi, sizeof(float) * 256);
Qmf2.Synthesis(&MidLowTmp[0], &low[0], &mid[0]);
diff --git a/src/atrac/atrac3_qmf.h b/src/atrac/atrac3_qmf.h
index 1ed137e..6c15846 100644
--- a/src/atrac/atrac3_qmf.h
+++ b/src/atrac/atrac3_qmf.h
@@ -22,20 +22,19 @@
namespace NAtracDEnc {
-template<class TIn>
class Atrac3AnalysisFilterBank {
const static int nInSamples = 1024;
- TQmf<TIn, nInSamples> Qmf1;
- TQmf<TIn, nInSamples / 2> Qmf2;
- TQmf<TIn, nInSamples / 2> Qmf3;
+ TQmf<nInSamples> Qmf1;
+ TQmf<nInSamples / 2> Qmf2;
+ TQmf<nInSamples / 2> Qmf3;
std::vector<float> Buf1;
std::vector<float> Buf2;
public:
- Atrac3AnalysisFilterBank() {
+ Atrac3AnalysisFilterBank() noexcept {
Buf1.resize(nInSamples);
Buf2.resize(nInSamples);
}
- void Analysis(TIn* pcm, float* subs[4]) {
+ void Analysis(const float* pcm, float* subs[4]) noexcept {
Qmf1.Analysis(pcm, Buf1.data(), Buf2.data());
Qmf2.Analysis(Buf1.data(), subs[0], subs[1]);
Qmf3.Analysis(Buf2.data(), subs[3], subs[2]);
diff --git a/src/atrac1denc.h b/src/atrac1denc.h
index c3b5f11..d709177 100644
--- a/src/atrac1denc.h
+++ b/src/atrac1denc.h
@@ -63,7 +63,7 @@ class TAtrac1Encoder : public IProcessor, public TAtrac1MDCT {
std::array<std::array<float, 256 + 16>, 2> PcmBufMid;
std::array<std::array<float, 512 + 16>, 2> PcmBufHi;
- Atrac1AnalysisFilterBank<float> AnalysisFilterBank[2];
+ Atrac1AnalysisFilterBank AnalysisFilterBank[2];
const std::vector<float> LoudnessCurve;
std::vector<std::unique_ptr<NAtrac1::IAtrac1BitAlloc>> BitAllocs;
@@ -117,7 +117,7 @@ class TAtrac1Decoder : public IProcessor, public TAtrac1MDCT {
int32_t PcmValueMax = 1;
int32_t PcmValueMin = -1;
- Atrac1SynthesisFilterBank<float> SynthesisFilterBank[2];
+ Atrac1SynthesisFilterBank SynthesisFilterBank[2];
public:
TAtrac1Decoder(TCompressedInputPtr&& aea);
TPCMEngine::TProcessLambda GetLambda() override;
diff --git a/src/atrac3denc.h b/src/atrac3denc.h
index 3f136d5..778efeb 100644
--- a/src/atrac3denc.h
+++ b/src/atrac3denc.h
@@ -89,7 +89,7 @@ class TAtrac3Encoder : public IProcessor, public TAtrac3MDCT {
float PrevPeak[2][4] = {{0.0}}; //2 channel, 4 band - peak level (after windowing), used to check overflow during scalling
- Atrac3AnalysisFilterBank<float> AnalysisFilterBank[2];
+ Atrac3AnalysisFilterBank AnalysisFilterBank[2];
TScaler<TAtrac3Data> Scaler;
std::vector<NAtrac3::TAtrac3BitStreamWriter::TSingleChannelElement> SingleChannelElements;
diff --git a/src/qmf/qmf.h b/src/qmf/qmf.h
index 81977f3..15b507c 100644
--- a/src/qmf/qmf.h
+++ b/src/qmf/qmf.h
@@ -21,15 +21,14 @@
#include "../config.h"
-template<class TPCM, int nIn>
+template<size_t nIn>
class TQmf {
static const float TapHalf[24];
float QmfWindow[48];
- TPCM PcmBuffer[nIn + 46];
+ float PcmBuffer[nIn + 46];
float PcmBufferMerge[nIn + 46];
- float DelayBuff[46];
public:
- TQmf() {
+ TQmf() noexcept {
const int sz = sizeof(QmfWindow)/sizeof(QmfWindow[0]);
for (size_t i = 0 ; i < sz/2; i++) {
@@ -41,13 +40,12 @@ public:
}
}
- void Analysis(TPCM* in, float* lower, float* upper) {
+ void Analysis(const float* in, float* lower, float* upper) noexcept {
float temp;
- for (size_t i = 0; i < 46; i++)
- PcmBuffer[i] = PcmBuffer[nIn + i];
- for (size_t i = 0; i < nIn; i++)
- PcmBuffer[46+i] = in[i];
+ memcpy(&PcmBuffer[0], &PcmBuffer[nIn], 46 * sizeof(float));
+
+ memcpy(&PcmBuffer[46], in, nIn * sizeof(float));
for (size_t j = 0; j < nIn; j+=2) {
lower[j/2] = upper[j/2] = 0.0;
@@ -61,10 +59,9 @@ public:
}
}
- void Synthesis(TPCM* out, float* lower, float* upper) {
- memcpy(&PcmBufferMerge[0], &DelayBuff[0], 46*sizeof(float));
+ void Synthesis(float* out, const float* lower, const float* upper) noexcept {
float* newPart = &PcmBufferMerge[46];
- for (int i = 0; i < nIn; i+=4) {
+ for (size_t i = 0; i < nIn; i+=4) {
newPart[i+0] = lower[i/2] + upper[i/2];
newPart[i+1] = lower[i/2] - upper[i/2];
newPart[i+2] = lower[i/2 + 1] + upper[i/2 + 1];
@@ -84,12 +81,12 @@ public:
winP += 2;
out += 2;
}
- memcpy(&DelayBuff[0], &PcmBufferMerge[nIn], 46*sizeof(float));
+ memcpy(&PcmBufferMerge[0], &PcmBufferMerge[nIn], 46 * sizeof(float));
}
};
-template<class TPCM, int nIn>
-const float TQmf<TPCM, nIn>::TapHalf[24] = {
+template<size_t nIn>
+const float TQmf<nIn>::TapHalf[24] = {
-0.00001461907, -0.00009205479, -0.000056157569, 0.00030117269,
0.0002422519, -0.00085293897, -0.0005205574, 0.0020340169,
0.00078333891, -0.0042153862, -0.00075614988, 0.0078402944,