aboutsummaryrefslogtreecommitdiffstats
path: root/src/atrac1denc.h
diff options
context:
space:
mode:
authorDaniil Cherednik <dan.cherednik@gmail.com>2016-06-19 02:58:23 +0300
committerDaniil Cherednik <dan.cherednik@gmail.com>2016-06-19 03:31:55 +0300
commit1151d5831f19a9f24dd0c545a4968606712a62d2 (patch)
treec978c1b9a3fc86fef531dd412fe6b7668b7c0567 /src/atrac1denc.h
parent8d65a0bd0774e03b3d10354e15f2f3361a2ce26a (diff)
downloadatracdenc-1151d5831f19a9f24dd0c545a4968606712a62d2.tar.gz
some improvements of ATRAC3 implementation:atrac3
- simple (ATRAC1 like) psychoacoustic added - possibility to encode tonal components - simple tonal component extractor - refactoring
Diffstat (limited to 'src/atrac1denc.h')
-rw-r--r--src/atrac1denc.h89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/atrac1denc.h b/src/atrac1denc.h
new file mode 100644
index 0000000..693a468
--- /dev/null
+++ b/src/atrac1denc.h
@@ -0,0 +1,89 @@
+#pragma once
+#include "pcmengin.h"
+#include "aea.h"
+#include "oma.h"
+#include "atrac_encode_settings.h"
+#include "transient_detector.h"
+#include "atrac/atrac1.h"
+#include "atrac/atrac1_qmf.h"
+#include "atrac/atrac_scale.h"
+#include "mdct/mdct.h"
+
+#include <assert.h>
+#include <vector>
+
+namespace NAtracDEnc {
+
+enum EMode {
+ E_ENCODE = 1,
+ E_DECODE = 2,
+ E_ATRAC3 = 4
+};
+
+class TAtrac1MDCT : public virtual NAtrac1::TAtrac1Data {
+ NMDCT::TMDCT<512> Mdct512;
+ NMDCT::TMDCT<256> Mdct256;
+ NMDCT::TMDCT<64> Mdct64;
+ NMDCT::TMIDCT<512> Midct512;
+ NMDCT::TMIDCT<256> Midct256;
+public:
+ void IMdct(TFloat specs[512], const TBlockSize& mode, TFloat* low, TFloat* mid, TFloat* hi);
+ void Mdct(TFloat specs[512], TFloat* low, TFloat* mid, TFloat* hi, const TBlockSize& blockSize);
+ TAtrac1MDCT()
+ : Mdct512(2)
+ , Mdct256(1)
+ {}
+};
+
+class TAtrac1Processor : public IProcessor<TFloat>, public TAtrac1MDCT, public virtual NAtrac1::TAtrac1Data {
+ TCompressedIOPtr Aea;
+ const NAtrac1::TAtrac1EncodeSettings Settings;
+
+ TFloat PcmBufLow[2][256 + 16];
+ TFloat PcmBufMid[2][256 + 16];
+ TFloat PcmBufHi[2][512 + 16];
+
+ int32_t PcmValueMax = 32767;
+ int32_t PcmValueMin = -32767;
+
+ Atrac1SynthesisFilterBank<TFloat> SynthesisFilterBank[2];
+ Atrac1SplitFilterBank<TFloat> SplitFilterBank[2];
+
+ class TTransientDetectors {
+ std::vector<TTransientDetector> transientDetectorLow;
+ std::vector<TTransientDetector> transientDetectorMid;
+ std::vector<TTransientDetector> transientDetectorHi;
+ public:
+ TTransientDetectors()
+ : transientDetectorLow(2, TTransientDetector(16, 128))
+ , transientDetectorMid(2, TTransientDetector(16, 128))
+ , transientDetectorHi(2, TTransientDetector(16, 256))
+ {}
+ TTransientDetector& GetDetector(uint32_t channel, uint32_t band) {
+ switch (band) {
+ case 0:
+ return transientDetectorLow[channel];
+ break;
+ case 1:
+ return transientDetectorMid[channel];
+ break;
+ case 2:
+ return transientDetectorHi[channel];
+ break;
+ default:
+ assert(false);
+ return transientDetectorLow[channel];
+ }
+ }
+ };
+ TAtrac1Processor::TTransientDetectors TransientDetectors;
+
+ TScaler<TAtrac1Data> Scaler;
+
+public:
+ TAtrac1Processor(TCompressedIOPtr&& aea, NAtrac1::TAtrac1EncodeSettings&& settings);
+ TPCMEngine<TFloat>::TProcessLambda GetDecodeLambda() override;
+
+ TPCMEngine<TFloat>::TProcessLambda GetEncodeLambda() override;
+};
+}