diff options
author | Daniil Cherednik <dan.cherednik@gmail.com> | 2025-01-25 23:50:51 +0000 |
---|---|---|
committer | Daniil Cherednik <dan.cherednik@gmail.com> | 2025-01-25 23:50:51 +0000 |
commit | 0696e23b2beef4a5525acd5a7013c7d1f3fd2f8e (patch) | |
tree | ae164a3e91a60eb51216239c6aeacc57accb39de /src/atrac | |
parent | 7733e7f22330dacb315c0df003446fbe9c22d6ba (diff) | |
parent | 0fe8e1a0d1a495e41a281f54af31d6713c0de01d (diff) | |
download | atracdenc-0696e23b2beef4a5525acd5a7013c7d1f3fd2f8e.tar.gz |
Merge branch 'master' into at3plus-devat3plus-dev
Diffstat (limited to 'src/atrac')
-rw-r--r-- | src/atrac/atrac1.cpp | 10 | ||||
-rw-r--r-- | src/atrac/atrac1.h | 33 | ||||
-rw-r--r-- | src/atrac/atrac1_bitalloc.cpp | 6 | ||||
-rw-r--r-- | src/atrac/atrac1_bitalloc.h | 10 | ||||
-rw-r--r-- | src/atrac/atrac1_dequantiser.cpp | 2 | ||||
-rw-r--r-- | src/atrac/atrac1_dequantiser.h | 2 | ||||
-rw-r--r-- | src/atrac/atrac3.h | 7 | ||||
-rw-r--r-- | src/atrac/atrac_scale.cpp | 5 | ||||
-rw-r--r-- | src/atrac/atrac_scale.h | 35 |
9 files changed, 65 insertions, 45 deletions
diff --git a/src/atrac/atrac1.cpp b/src/atrac/atrac1.cpp index 0c1c053..b361ad5 100644 --- a/src/atrac/atrac1.cpp +++ b/src/atrac/atrac1.cpp @@ -17,6 +17,7 @@ */ #include "atrac1.h" +#include "bitstream/bitstream.h" namespace NAtracDEnc { namespace NAtrac1 { @@ -31,5 +32,14 @@ float TAtrac1Data::SineWindow[32] = {0}; const static TAtrac1Data Atrac1Data; +std::array<int, 3> TAtrac1Data::TBlockSizeMod::Parse(NBitStream::TBitStream* stream) { + std::array<int, 3> tmp; + tmp[0] = 2 - stream->Read(2); + tmp[1] = 2 - stream->Read(2); + tmp[2] = 3 - stream->Read(2); + stream->Read(2); //skip unused 2 bits + return tmp; +} + } //namespace NAtrac1 } //namespace NAtracDEnc diff --git a/src/atrac/atrac1.h b/src/atrac/atrac1.h index ae1809b..dfd0fd3 100644 --- a/src/atrac/atrac1.h +++ b/src/atrac/atrac1.h @@ -22,6 +22,11 @@ #include <map> #include <math.h> #include "config.h" + +namespace NBitStream { + class TBitStream; +} + namespace NAtracDEnc { namespace NAtrac1 { @@ -53,6 +58,34 @@ public: class TAtrac1Data { public: + class TBlockSizeMod { + static std::array<int, 3> Parse(NBitStream::TBitStream* stream); + static std::array<int, 3> Create(bool lowShort, bool midShort, bool hiShort) { + std::array<int, 3> tmp; + tmp[0] = lowShort ? 2 : 0; + tmp[1] = midShort ? 2 : 0; + tmp[2] = hiShort ? 3 : 0; + return tmp; + } + public: + bool ShortWin(uint8_t band) const noexcept { + return LogCount[band]; + } + + TBlockSizeMod(NBitStream::TBitStream* stream) + : LogCount(Parse(stream)) + {} + + TBlockSizeMod(bool lowShort, bool midShort, bool hiShort) + : LogCount(Create(lowShort, midShort, hiShort)) + {} + + TBlockSizeMod() + : LogCount({{0, 0, 0}}) + {} + + std::array<int, 3> LogCount; + }; static constexpr uint8_t MaxBfus = 52; static constexpr uint8_t NumQMF = 3; diff --git a/src/atrac/atrac1_bitalloc.cpp b/src/atrac/atrac1_bitalloc.cpp index 5b20cc8..f40ebe2 100644 --- a/src/atrac/atrac1_bitalloc.cpp +++ b/src/atrac/atrac1_bitalloc.cpp @@ -127,7 +127,7 @@ vector<uint32_t> TAtrac1SimpleBitAlloc::CalcBitsAllocation(const std::vector<TSc const uint32_t bfuNum, const float spread, const float shift, - const TBlockSize& blockSize, + const TAtrac1Data::TBlockSizeMod& blockSize, const float loudness) { vector<uint32_t> bitsPerEachBlock(bfuNum); for (size_t i = 0; i < bitsPerEachBlock.size(); ++i) { @@ -186,7 +186,7 @@ uint32_t TAtrac1SimpleBitAlloc::CheckBfuUsage(bool* changed, return curBfuId; } -uint32_t TAtrac1SimpleBitAlloc::Write(const std::vector<TScaledBlock>& scaledBlocks, const TBlockSize& blockSize, float loudness) { +uint32_t TAtrac1SimpleBitAlloc::Write(const std::vector<TScaledBlock>& scaledBlocks, const TAtrac1Data::TBlockSizeMod& blockSize, float loudness) { uint32_t bfuIdx = BfuIdxConst ? BfuIdxConst - 1 : 7; bool autoBfu = !BfuIdxConst; float spread = AnalizeScaleFactorSpread(scaledBlocks); @@ -261,7 +261,7 @@ TAtrac1BitStreamWriter::TAtrac1BitStreamWriter(ICompressedOutput* container) void TAtrac1BitStreamWriter::WriteBitStream(const vector<uint32_t>& bitsPerEachBlock, const std::vector<TScaledBlock>& scaledBlocks, uint32_t bfuAmountIdx, - const TBlockSize& blockSize) { + const TAtrac1Data::TBlockSizeMod& blockSize) { NBitStream::TBitStream bitStream; size_t bitUsed = 0; if (bfuAmountIdx >= (1 << TAtrac1Data::BitsPerBfuAmountTabIdx)) { diff --git a/src/atrac/atrac1_bitalloc.h b/src/atrac/atrac1_bitalloc.h index ca01b13..a93eba3 100644 --- a/src/atrac/atrac1_bitalloc.h +++ b/src/atrac/atrac1_bitalloc.h @@ -18,6 +18,7 @@ #pragma once #include "atrac_scale.h" +#include "atrac/atrac1.h" #include "../aea.h" #include <vector> #include <map> @@ -32,7 +33,7 @@ class IAtrac1BitAlloc { public: IAtrac1BitAlloc() {}; virtual ~IAtrac1BitAlloc() {}; - virtual uint32_t Write(const std::vector<TScaledBlock>& scaledBlocks, const TBlockSize& blockSize, float loudness) = 0; + virtual uint32_t Write(const std::vector<TScaledBlock>& scaledBlocks, const TAtrac1Data::TBlockSizeMod& blockSize, float loudness) = 0; }; class TBitsBooster { @@ -50,12 +51,13 @@ public: explicit TAtrac1BitStreamWriter(ICompressedOutput* container); void WriteBitStream(const std::vector<uint32_t>& bitsPerEachBlock, const std::vector<TScaledBlock>& scaledBlocks, - uint32_t bfuAmountIdx, const TBlockSize& blockSize); + uint32_t bfuAmountIdx, const TAtrac1Data::TBlockSizeMod& blockSize); }; class TAtrac1SimpleBitAlloc : public TAtrac1BitStreamWriter, public TBitsBooster, public virtual IAtrac1BitAlloc { std::vector<uint32_t> CalcBitsAllocation(const std::vector<TScaledBlock>& scaledBlocks, const uint32_t bfuNum, - const float spread, const float shift, const TBlockSize& blockSize, + const float spread, const float shift, + const TAtrac1Data::TBlockSizeMod& blockSize, const float loudness); const uint32_t BfuIdxConst; const bool FastBfuNumSearch; @@ -66,7 +68,7 @@ class TAtrac1SimpleBitAlloc : public TAtrac1BitStreamWriter, public TBitsBooster public: TAtrac1SimpleBitAlloc(ICompressedOutput* container, uint32_t bfuIdxConst, bool fastBfuNumSearch); ~TAtrac1SimpleBitAlloc() {}; - uint32_t Write(const std::vector<TScaledBlock>& scaledBlocks, const TBlockSize& blockSize, float loudness) override; + uint32_t Write(const std::vector<TScaledBlock>& scaledBlocks, const TAtrac1Data::TBlockSizeMod& blockSize, float loudness) override; }; } //namespace NAtrac1 diff --git a/src/atrac/atrac1_dequantiser.cpp b/src/atrac/atrac1_dequantiser.cpp index bcc087d..74ccc9b 100644 --- a/src/atrac/atrac1_dequantiser.cpp +++ b/src/atrac/atrac1_dequantiser.cpp @@ -26,7 +26,7 @@ using namespace NBitStream; TAtrac1Dequantiser::TAtrac1Dequantiser() { } -void TAtrac1Dequantiser::Dequant(TBitStream* stream, const TBlockSize& bs, float specs[512]) { +void TAtrac1Dequantiser::Dequant(TBitStream* stream, const TAtrac1Data::TBlockSizeMod& bs, float specs[512]) { uint32_t wordLens[TAtrac1Data::MaxBfus]; uint32_t idScaleFactors[TAtrac1Data::MaxBfus]; const uint32_t numBFUs = TAtrac1Data::BfuAmountTab[stream->Read(3)]; diff --git a/src/atrac/atrac1_dequantiser.h b/src/atrac/atrac1_dequantiser.h index 0b57c08..8cb58f1 100644 --- a/src/atrac/atrac1_dequantiser.h +++ b/src/atrac/atrac1_dequantiser.h @@ -27,7 +27,7 @@ namespace NAtrac1 { class TAtrac1Dequantiser { public: TAtrac1Dequantiser(); - void Dequant(NBitStream::TBitStream* stream, const TBlockSize& bs, float specs[512]); + void Dequant(NBitStream::TBitStream* stream, const TAtrac1Data::TBlockSizeMod& bs, float specs[512]); }; } //namespace NAtrac1 diff --git a/src/atrac/atrac3.h b/src/atrac/atrac3.h index 103f6fc..ba14773 100644 --- a/src/atrac/atrac3.h +++ b/src/atrac/atrac3.h @@ -52,6 +52,13 @@ inline bool operator> (const TContainerParams& x, const unsigned int y) class TAtrac3Data { public: + class TBlockSizeMod { + public: + constexpr bool ShortWin(uint8_t) const noexcept { + return false; + } + }; + static constexpr uint8_t MaxBfus = 32; static constexpr uint32_t NumSamples = 1024; diff --git a/src/atrac/atrac_scale.cpp b/src/atrac/atrac_scale.cpp index a436aae..5a75bdd 100644 --- a/src/atrac/atrac_scale.cpp +++ b/src/atrac/atrac_scale.cpp @@ -172,11 +172,12 @@ TScaledBlock TScaler<TBaseData>::Scale(const float* in, uint16_t len) { } template<class TBaseData> -vector<TScaledBlock> TScaler<TBaseData>::ScaleFrame(const vector<float>& specs, const TBlockSize& blockSize) { +vector<TScaledBlock> TScaler<TBaseData>::ScaleFrame(const vector<float>& specs, const typename TBaseData::TBlockSizeMod& blockSize) { vector<TScaledBlock> scaledBlocks; scaledBlocks.reserve(TBaseData::MaxBfus); for (uint8_t bandNum = 0; bandNum < TBaseData::NumQMF; ++bandNum) { - const bool shortWinMode = !!blockSize.LogCount[bandNum]; + const bool shortWinMode = blockSize.ShortWin(bandNum); + for (uint8_t blockNum = TBaseData::BlocksPerBand[bandNum]; blockNum < TBaseData::BlocksPerBand[bandNum + 1]; ++blockNum) { const uint16_t specNumStart = shortWinMode ? TBaseData::SpecsStartShort[blockNum] : TBaseData::SpecsStartLong[blockNum]; diff --git a/src/atrac/atrac_scale.h b/src/atrac/atrac_scale.h index 9a812f0..bca2e61 100644 --- a/src/atrac/atrac_scale.h +++ b/src/atrac/atrac_scale.h @@ -36,46 +36,13 @@ struct TScaledBlock { float MaxEnergy; }; -class TBlockSize; - template <class TBaseData> class TScaler { std::map<float, uint8_t> ScaleIndex; public: TScaler(); TScaledBlock Scale(const float* in, uint16_t len); - std::vector<TScaledBlock> ScaleFrame(const std::vector<float>& specs, const TBlockSize& blockSize); -}; - -class TBlockSize { - static std::array<int, 4> Parse(NBitStream::TBitStream* stream) { - //ATRAC1 - 3 subbands, ATRAC3 - 4 subbands. - //TODO: rewrite - std::array<int, 4> tmp; - tmp[0] = 2 - stream->Read(2); - tmp[1] = 2 - stream->Read(2); - tmp[2] = 3 - stream->Read(2); - stream->Read(2); //skip unused 2 bits - return tmp; - } - static std::array<int, 4> Create(bool lowShort, bool midShort, bool hiShort) { - std::array<int, 4> tmp; - tmp[0] = lowShort ? 2 : 0; - tmp[1] = midShort ? 2 : 0; - tmp[2] = hiShort ? 3 : 0; - return tmp; - } -public: - TBlockSize(NBitStream::TBitStream* stream) - : LogCount(Parse(stream)) - {} - TBlockSize(bool lowShort, bool midShort, bool hiShort) - : LogCount(Create(lowShort, midShort, hiShort)) - {} - TBlockSize() - : LogCount({{0, 0, 0, 0}}) - {} - std::array<int, 4> LogCount; + std::vector<TScaledBlock> ScaleFrame(const std::vector<float>& specs, const typename TBaseData::TBlockSizeMod& blockSize); }; } //namespace NAtracDEnc |