aboutsummaryrefslogtreecommitdiffstats
path: root/src/atrac/atrac3_bitstream.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/atrac/atrac3_bitstream.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/atrac/atrac3_bitstream.h')
-rw-r--r--src/atrac/atrac3_bitstream.h54
1 files changed, 48 insertions, 6 deletions
diff --git a/src/atrac/atrac3_bitstream.h b/src/atrac/atrac3_bitstream.h
index 60f1e4a..225d98c 100644
--- a/src/atrac/atrac3_bitstream.h
+++ b/src/atrac/atrac3_bitstream.h
@@ -8,16 +8,53 @@
#include <vector>
#include <utility>
-static const uint32_t MAXSPECPERBLOCK = 128;
+namespace NAtracDEnc {
+namespace NAtrac3 {
+
+struct TTonalComponent {
+ TTonalComponent(const TAtrac3Data::TTonalVal* valPtr, uint8_t quantIdx, const TScaledBlock& scaledBlock)
+ : ValPtr(valPtr)
+ , QuantIdx(quantIdx)
+ , ScaledBlock(scaledBlock)
+ {}
+ const TAtrac3Data::TTonalVal* ValPtr = nullptr;
+ uint8_t QuantIdx = 0;
+ TScaledBlock ScaledBlock;
+};
class TAtrac3BitStreamWriter : public virtual TAtrac3Data {
+ struct TTonalComponentsSubGroup {
+ std::vector<uint8_t> SubGroupMap;
+ std::vector<const TTonalComponent*> SubGroupPtr;
+ };
TOma* Container;
const TContainerParams Params;
std::vector<char> OutBuffer;
- uint32_t CLCEnc(const uint32_t selector, const int mantissas[MAXSPECPERBLOCK], const uint32_t blockSize, NBitStream::TBitStream* bitStream);
- uint32_t VLCEnc(const uint32_t selector, const int mantissas[MAXSPECPERBLOCK], const uint32_t blockSize, NBitStream::TBitStream* bitStream);
- std::pair<uint8_t, uint32_t> CalcSpecsBitsConsumption(const std::vector<NAtracDEnc::TScaledBlock>& scaledBlocks, const std::vector<uint32_t>& precisionPerEachBlocks, int* mantisas);
- void EncodeSpecs(const std::vector<NAtracDEnc::TScaledBlock>& scaledBlocks, const std::vector<uint32_t>& bitsPerEachBlock, NBitStream::TBitStream* bitStream);
+
+ uint32_t CLCEnc(const uint32_t selector, const int mantissas[MaxSpecsPerBlock],
+ const uint32_t blockSize, NBitStream::TBitStream* bitStream);
+
+ uint32_t VLCEnc(const uint32_t selector, const int mantissas[MaxSpecsPerBlock],
+ const uint32_t blockSize, NBitStream::TBitStream* bitStream);
+
+ std::vector<uint32_t> CalcBitsAllocation(const std::vector<TScaledBlock>& scaledBlocks,
+ uint32_t bfuNum, TFloat spread, TFloat shift);
+
+ std::pair<uint8_t, std::vector<uint32_t>> CreateAllocation(const std::vector<TScaledBlock>& scaledBlocks,
+ uint16_t bitsUsed, int mt[MaxSpecs]);
+
+ std::pair<uint8_t, uint32_t> CalcSpecsBitsConsumption(const std::vector<TScaledBlock>& scaledBlocks,
+ const std::vector<uint32_t>& precisionPerEachBlocks,
+ int* mantisas);
+
+ void EncodeSpecs(const std::vector<TScaledBlock>& scaledBlocks, NBitStream::TBitStream* bitStream,
+ uint16_t bitsUsed);
+
+ uint8_t GroupTonalComponents(const std::vector<TTonalComponent>& tonalComponents,
+ TTonalComponentsSubGroup groups[64]);
+
+ uint16_t EncodeTonalComponents(const std::vector<TTonalComponent>& tonalComponents,
+ NBitStream::TBitStream* bitStream, uint8_t numQmfBand);
public:
TAtrac3BitStreamWriter(TOma* container, const TContainerParams& params) //no mono mode for atrac3
: Container(container)
@@ -25,5 +62,10 @@ public:
{
}
- void WriteSoundUnit(const TAtrac3Data::SubbandInfo& subbandInfo, const std::vector<NAtracDEnc::TScaledBlock>& scaledBlocks);
+ void WriteSoundUnit(const TAtrac3Data::SubbandInfo& subbandInfo,
+ const std::vector<TTonalComponent>& tonalComponents,
+ const std::vector<TScaledBlock>& scaledBlocks);
};
+
+} // namespace NAtrac3
+} // namespace NAtracDEnc