diff options
author | Daniil Cherednik <dan.cherednik@gmail.com> | 2020-01-12 22:20:51 +0300 |
---|---|---|
committer | Daniil Cherednik <dan.cherednik@gmail.com> | 2020-01-12 22:20:51 +0300 |
commit | 83d5e5d3652608478b5f18212bd3fec2338ae954 (patch) | |
tree | f8565d3d74bc68ae1b7c0710ceeb1a2bb57303e5 /src/atrac/atrac3_bitstream.cpp | |
parent | 5ae5ed6b6c6f0a49372288e309244ccd0b54060f (diff) | |
download | atracdenc-83d5e5d3652608478b5f18212bd3fec2338ae954.tar.gz |
[atrac3] Initial joint stereo mode support.
Diffstat (limited to 'src/atrac/atrac3_bitstream.cpp')
-rw-r--r-- | src/atrac/atrac3_bitstream.cpp | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/atrac/atrac3_bitstream.cpp b/src/atrac/atrac3_bitstream.cpp index b0995fc..8164258 100644 --- a/src/atrac/atrac3_bitstream.cpp +++ b/src/atrac/atrac3_bitstream.cpp @@ -455,6 +455,14 @@ vector<uint32_t> TAtrac3BitStreamWriter::CalcBitsAllocation(const std::vector<TS return bitsPerEachBlock; } +void WriteJsParams(NBitStream::TBitStream* bs) +{ + bs->Write(0, 1); + bs->Write(7, 3); + for (int i = 0; i < 4; i++) { + bs->Write(3, 2); + } +} void TAtrac3BitStreamWriter::WriteSoundUnit(const vector<TSingleChannelElement>& singleChannelElements) { @@ -468,12 +476,13 @@ void TAtrac3BitStreamWriter::WriteSoundUnit(const vector<TSingleChannelElement>& NBitStream::TBitStream* bitStream = &bitStreams[channel]; - if (Params.Js) { - //TODO - abort(); + if (Params.Js && channel == 1) { + WriteJsParams(bitStream); + bitStream->Write(3, 2); } else { bitStream->Write(0x28, 6); //0x28 - id } + const uint8_t numQmfBand = subbandInfo.GetQmfNum(); bitStream->Write(numQmfBand - 1, 2); @@ -504,8 +513,13 @@ void TAtrac3BitStreamWriter::WriteSoundUnit(const vector<TSingleChannelElement>& abort(); std::vector<char> channelData = bitStream->GetBytes(); assert(bitStream->GetSizeInBits() <= 8 * (size_t)Params.FrameSz / 2); - channelData.resize(Params.FrameSz >> 1); - OutBuffer.insert(OutBuffer.end(), channelData.begin(), channelData.end()); + if (Params.Js && channel == 1) { + channelData.resize(Params.FrameSz >> 1); + OutBuffer.insert(OutBuffer.end(), channelData.rbegin(), channelData.rend()); + } else { + channelData.resize(Params.FrameSz >> 1); + OutBuffer.insert(OutBuffer.end(), channelData.begin(), channelData.end()); + } } //No mone mode for atrac3, just make duplicate of first channel |