aboutsummaryrefslogtreecommitdiffstats
path: root/src/atrac/atrac3_bitstream.cpp
diff options
context:
space:
mode:
authorDaniil Cherednik <dan.cherednik@gmail.com>2020-01-12 22:20:51 +0300
committerDaniil Cherednik <dan.cherednik@gmail.com>2020-01-12 22:20:51 +0300
commit83d5e5d3652608478b5f18212bd3fec2338ae954 (patch)
treef8565d3d74bc68ae1b7c0710ceeb1a2bb57303e5 /src/atrac/atrac3_bitstream.cpp
parent5ae5ed6b6c6f0a49372288e309244ccd0b54060f (diff)
downloadatracdenc-83d5e5d3652608478b5f18212bd3fec2338ae954.tar.gz
[atrac3] Initial joint stereo mode support.
Diffstat (limited to 'src/atrac/atrac3_bitstream.cpp')
-rw-r--r--src/atrac/atrac3_bitstream.cpp24
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