diff options
author | Daniil Cherednik <dan.cherednik@gmail.com> | 2016-06-19 02:58:23 +0300 |
---|---|---|
committer | Daniil Cherednik <dan.cherednik@gmail.com> | 2016-06-19 03:31:55 +0300 |
commit | 1151d5831f19a9f24dd0c545a4968606712a62d2 (patch) | |
tree | c978c1b9a3fc86fef531dd412fe6b7668b7c0567 /src/atrac1denc.h | |
parent | 8d65a0bd0774e03b3d10354e15f2f3361a2ce26a (diff) | |
download | atracdenc-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.h | 89 |
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; +}; +} |