aboutsummaryrefslogtreecommitdiff
path: root/audio/decoders
diff options
context:
space:
mode:
authorD G Turner2012-04-09 08:26:13 +0100
committerD G Turner2012-04-13 07:37:24 +0100
commitfa44707028f19a08c9f201278c0c8ffa7f27b4d8 (patch)
treeab6839153acd8188cb80219a513a5ca50bd13522 /audio/decoders
parent7eef26268c9abf5f61a32f547a5037ac1c19e869 (diff)
downloadscummvm-rg350-fa44707028f19a08c9f201278c0c8ffa7f27b4d8.tar.gz
scummvm-rg350-fa44707028f19a08c9f201278c0c8ffa7f27b4d8.tar.bz2
scummvm-rg350-fa44707028f19a08c9f201278c0c8ffa7f27b4d8.zip
AUDIO: Initial Refactoring of QDM2 to use Common::BitStream.
This removes the internal getBitContext bitwise reading code and replaces with Common::BitStream. However, this breaks the codec as in one location, the internal buffer of getBitContext reader is used and this can't be directly replaced. This will need to be understood and rewritten.
Diffstat (limited to 'audio/decoders')
-rw-r--r--audio/decoders/qdm2.cpp252
1 files changed, 99 insertions, 153 deletions
diff --git a/audio/decoders/qdm2.cpp b/audio/decoders/qdm2.cpp
index 2de7a68dd9..0388450bd2 100644
--- a/audio/decoders/qdm2.cpp
+++ b/audio/decoders/qdm2.cpp
@@ -36,6 +36,8 @@
#include "common/debug.h"
#include "common/math.h"
#include "common/stream.h"
+#include "common/memstream.h"
+#include "common/bitstream.h"
#include "common/textconsole.h"
namespace Audio {
@@ -50,14 +52,6 @@ enum {
typedef int8 sb_int8_array[2][30][64];
-/* bit input */
-/* buffer, buffer_end and size_in_bits must be present and used by every reader */
-struct GetBitContext {
- const uint8 *buffer, *bufferEnd;
- int index;
- int sizeInBits;
-};
-
struct QDM2SubPacket {
int type;
unsigned int size;
@@ -265,9 +259,9 @@ private:
void fill_coding_method_array(sb_int8_array tone_level_idx, sb_int8_array tone_level_idx_temp,
sb_int8_array coding_method, int nb_channels,
int c, int superblocktype_2_3, int cm_table_select);
- void synthfilt_build_sb_samples(GetBitContext *gb, int length, int sb_min, int sb_max);
- void init_quantized_coeffs_elem0(int8 *quantized_coeffs, GetBitContext *gb, int length);
- void init_tone_level_dequantization(GetBitContext *gb, int length);
+ void synthfilt_build_sb_samples(Common::BitStream *gb, int length, int sb_min, int sb_max);
+ void init_quantized_coeffs_elem0(int8 *quantized_coeffs, Common::BitStream *gb, int length);
+ void init_tone_level_dequantization(Common::BitStream *gb, int length);
void process_subpacket_9(QDM2SubPNode *node);
void process_subpacket_10(QDM2SubPNode *node, int length);
void process_subpacket_11(QDM2SubPNode *node, int length);
@@ -276,7 +270,7 @@ private:
void qdm2_decode_super_block(void);
void qdm2_fft_init_coefficient(int sub_packet, int offset, int duration,
int channel, int exp, int phase);
- void qdm2_fft_decode_tones(int duration, GetBitContext *gb, int b);
+ void qdm2_fft_decode_tones(int duration, Common::BitStream *gb, int b);
void qdm2_decode_fft_packets(void);
void qdm2_fft_generate_tone(FFTTone *tone);
void qdm2_fft_tone_synthesizer(uint8 sub_packet);
@@ -308,59 +302,6 @@ typedef signed long long int int64_t;
#define SB_DITHERING_NOISE(sb, noiseIdx) (_noiseTable[(noiseIdx)++] * sb_noise_attenuation[(sb)])
-static inline void initGetBits(GetBitContext *s, const uint8 *buffer, int bitSize) {
- int bufferSize = (bitSize + 7) >> 3;
-
- if (bufferSize < 0 || bitSize < 0) {
- bufferSize = bitSize = 0;
- buffer = NULL;
- }
-
- s->buffer = buffer;
- s->sizeInBits = bitSize;
- s->bufferEnd = buffer + bufferSize;
- s->index = 0;
-}
-
-static inline int getBitsCount(GetBitContext *s) {
- return s->index;
-}
-
-static inline unsigned int getBits1(GetBitContext *s) {
- int index;
- uint8 result;
-
- index = s->index;
- result = s->buffer[index >> 3];
-
- result >>= (index & 0x07);
- result &= 1;
- index++;
- s->index = index;
-
- return result;
-}
-
-static inline unsigned int getBits(GetBitContext *s, int n) {
- int tmp, reCache, reIndex;
-
- reIndex = s->index;
-
- reCache = READ_LE_UINT32((const uint8 *)s->buffer + (reIndex >> 3)) >> (reIndex & 0x07);
-
- tmp = (reCache) & ((uint32)0xffffffff >> (32 - n));
-
- s->index = reIndex + n;
-
- return tmp;
-}
-
-static inline void skipBits(GetBitContext *s, int n) {
- s->index += n;
-}
-
-#define BITS_LEFT(length, gb) ((length) - getBitsCount((gb)))
-
static int splitRadixPermutation(int i, int n, int inverse) {
if (n <= 2)
return i & 1;
@@ -1283,43 +1224,36 @@ void ff_mpa_synth_filter(int16 *synth_buf_ptr, int *synth_buf_offset,
* read the longest vlc code
* = (max_vlc_length + bits - 1) / bits
*/
-static int getVlc2(GetBitContext *s, int16 (*table)[2], int bits, int maxDepth) {
- int reIndex;
- int reCache;
+static int getVlc2(Common::BitStream *s, int16 (*table)[2], int bits, int maxDepth) {
+ int totalBits = 0;
int index;
int code;
int n;
- reIndex = s->index;
- reCache = READ_LE_UINT32(s->buffer + (reIndex >> 3)) >> (reIndex & 0x07);
- index = reCache & (0xffffffff >> (32 - bits));
+ index = s->peekBits(bits);
code = table[index][0];
n = table[index][1];
- if (maxDepth > 1 && n < 0){
- reIndex += bits;
- reCache = READ_LE_UINT32(s->buffer + (reIndex >> 3)) >> (reIndex & 0x07);
-
- int nbBits = -n;
+ if (maxDepth > 1 && n < 0) {
+ totalBits += bits;
+ s->skip(bits);
- index = (reCache & (0xffffffff >> (32 - nbBits))) + code;
+ index = s->peekBits(-n) + code;
code = table[index][0];
n = table[index][1];
if(maxDepth > 2 && n < 0) {
- reIndex += nbBits;
- reCache = READ_LE_UINT32(s->buffer + (reIndex >> 3)) >> (reIndex & 0x07);
+ totalBits += -n;
+ s->skip(-n);
- nbBits = -n;
-
- index = (reCache & (0xffffffff >> (32 - nbBits))) + code;
+ index = s->peekBits(-n) + code;
code = table[index][0];
n = table[index][1];
}
}
- reCache >>= n;
- s->index = reIndex + n;
+ s->skip(totalBits + n);
+
return code;
}
@@ -1848,26 +1782,26 @@ QDM2Stream::~QDM2Stream() {
delete[] _compressedData;
}
-static int qdm2_get_vlc(GetBitContext *gb, VLC *vlc, int flag, int depth) {
+static int qdm2_get_vlc(Common::BitStream *gb, VLC *vlc, int flag, int depth) {
int value = getVlc2(gb, vlc->table, vlc->bits, depth);
// stage-2, 3 bits exponent escape sequence
if (value-- == 0)
- value = getBits(gb, getBits (gb, 3) + 1);
+ value = gb->getBits(gb->getBits(3) + 1);
// stage-3, optional
if (flag) {
int tmp = vlc_stage3_values[value];
if ((value & ~3) > 0)
- tmp += getBits(gb, (value >> 2));
+ tmp += gb->getBits(value >> 2);
value = tmp;
}
return value;
}
-static int qdm2_get_se_vlc(VLC *vlc, GetBitContext *gb, int depth)
+static int qdm2_get_se_vlc(VLC *vlc, Common::BitStream *gb, int depth)
{
int value = qdm2_get_vlc(gb, vlc, 0, depth);
@@ -1898,26 +1832,27 @@ static uint16 qdm2_packet_checksum(const uint8 *data, int length, int value) {
* @param gb bitreader context
* @param sub_packet packet under analysis
*/
-static void qdm2_decode_sub_packet_header(GetBitContext *gb, QDM2SubPacket *sub_packet)
+static void qdm2_decode_sub_packet_header(Common::BitStream *gb, QDM2SubPacket *sub_packet)
{
- sub_packet->type = getBits (gb, 8);
+ sub_packet->type = gb->getBits(8);
if (sub_packet->type == 0) {
sub_packet->size = 0;
sub_packet->data = NULL;
} else {
- sub_packet->size = getBits (gb, 8);
+ sub_packet->size = gb->getBits(8);
if (sub_packet->type & 0x80) {
sub_packet->size <<= 8;
- sub_packet->size |= getBits (gb, 8);
+ sub_packet->size |= gb->getBits(8);
sub_packet->type &= 0x7f;
}
if (sub_packet->type == 0x7f)
- sub_packet->type |= (getBits (gb, 8) << 8);
+ sub_packet->type |= (gb->getBits(8) << 8);
- sub_packet->data = &gb->buffer[getBitsCount(gb) / 8]; // FIXME: this depends on bitreader internal data
+ // FIXME: Replace internal bitstream buffer usage
+ //sub_packet->data = &gb->buffer[gb->size() / 8];
}
}
@@ -2256,7 +2191,7 @@ void QDM2Stream::fill_coding_method_array(sb_int8_array tone_level_idx, sb_int8_
* @param sb_min lower subband processed (sb_min included)
* @param sb_max higher subband processed (sb_max excluded)
*/
-void QDM2Stream::synthfilt_build_sb_samples(GetBitContext *gb, int length, int sb_min, int sb_max) {
+void QDM2Stream::synthfilt_build_sb_samples(Common::BitStream *gb, int length, int sb_min, int sb_max) {
int sb, j, k, n, ch, run, channels;
int joined_stereo, zero_encoding, chs;
int type34_first;
@@ -2282,12 +2217,12 @@ void QDM2Stream::synthfilt_build_sb_samples(GetBitContext *gb, int length, int s
else if (sb >= 24)
joined_stereo = 1;
else
- joined_stereo = (BITS_LEFT(length,gb) >= 1) ? getBits1 (gb) : 0;
+ joined_stereo = ((length - gb->pos()) >= 1) ? gb->getBit() : 0;
if (joined_stereo) {
- if (BITS_LEFT(length,gb) >= 16)
+ if ((length - gb->pos()) >= 16)
for (j = 0; j < 16; j++)
- sign_bits[j] = getBits1(gb);
+ sign_bits[j] = gb->getBit();
for (j = 0; j < 64; j++)
if (_codingMethod[1][sb][j] > _codingMethod[0][sb][j])
@@ -2298,22 +2233,22 @@ void QDM2Stream::synthfilt_build_sb_samples(GetBitContext *gb, int length, int s
}
for (ch = 0; ch < channels; ch++) {
- zero_encoding = (BITS_LEFT(length,gb) >= 1) ? getBits1(gb) : 0;
+ zero_encoding = ((length - gb->pos()) >= 1) ? gb->getBit() : 0;
type34_predictor = 0.0;
type34_first = 1;
for (j = 0; j < 128; ) {
switch (_codingMethod[ch][sb][j / 2]) {
case 8:
- if (BITS_LEFT(length,gb) >= 10) {
+ if ((length - gb->pos()) >= 10) {
if (zero_encoding) {
for (k = 0; k < 5; k++) {
if ((j + 2 * k) >= 128)
break;
- samples[2 * k] = getBits1(gb) ? dequant_1bit[joined_stereo][2 * getBits1(gb)] : 0;
+ samples[2 * k] = gb->getBit() ? dequant_1bit[joined_stereo][2 * gb->getBit()] : 0;
}
} else {
- n = getBits(gb, 8);
+ n = gb->getBits(8);
for (k = 0; k < 5; k++)
samples[2 * k] = dequant_1bit[joined_stereo][_randomDequantIndex[n][k]];
}
@@ -2327,10 +2262,10 @@ void QDM2Stream::synthfilt_build_sb_samples(GetBitContext *gb, int length, int s
break;
case 10:
- if (BITS_LEFT(length,gb) >= 1) {
+ if ((length - gb->pos()) >= 1) {
double f = 0.81;
- if (getBits1(gb))
+ if (gb->getBit())
f = -f;
f -= _noiseSamples[((sb + 1) * (j +5 * ch + 1)) & 127] * 9.0 / 40.0;
samples[0] = f;
@@ -2341,15 +2276,15 @@ void QDM2Stream::synthfilt_build_sb_samples(GetBitContext *gb, int length, int s
break;
case 16:
- if (BITS_LEFT(length,gb) >= 10) {
+ if ((length - gb->pos()) >= 10) {
if (zero_encoding) {
for (k = 0; k < 5; k++) {
if ((j + k) >= 128)
break;
- samples[k] = (getBits1(gb) == 0) ? 0 : dequant_1bit[joined_stereo][2 * getBits1(gb)];
+ samples[k] = (gb->getBit() == 0) ? 0 : dequant_1bit[joined_stereo][2 * gb->getBit()];
}
} else {
- n = getBits (gb, 8);
+ n = gb->getBits(8);
for (k = 0; k < 5; k++)
samples[k] = dequant_1bit[joined_stereo][_randomDequantIndex[n][k]];
}
@@ -2361,8 +2296,8 @@ void QDM2Stream::synthfilt_build_sb_samples(GetBitContext *gb, int length, int s
break;
case 24:
- if (BITS_LEFT(length,gb) >= 7) {
- n = getBits(gb, 7);
+ if ((length - gb->pos()) >= 7) {
+ n = gb->getBits(7);
for (k = 0; k < 3; k++)
samples[k] = (_randomDequantType24[n][k] - 2.0) * 0.5;
} else {
@@ -2373,7 +2308,7 @@ void QDM2Stream::synthfilt_build_sb_samples(GetBitContext *gb, int length, int s
break;
case 30:
- if (BITS_LEFT(length,gb) >= 4)
+ if ((length - gb->pos()) >= 4)
samples[0] = type30_dequant[qdm2_get_vlc(gb, &_vlcTabType30, 0, 1)];
else
samples[0] = SB_DITHERING_NOISE(sb, _noiseIdx);
@@ -2382,10 +2317,10 @@ void QDM2Stream::synthfilt_build_sb_samples(GetBitContext *gb, int length, int s
break;
case 34:
- if (BITS_LEFT(length,gb) >= 7) {
+ if ((length - gb->pos()) >= 7) {
if (type34_first) {
- type34_div = (float)(1 << getBits(gb, 2));
- samples[0] = ((float)getBits(gb, 5) - 16.0) / 15.0;
+ type34_div = (float)(1 << gb->getBits(2));
+ samples[0] = ((float)gb->getBits(5) - 16.0) / 15.0;
type34_predictor = samples[0];
type34_first = 0;
} else {
@@ -2436,21 +2371,21 @@ void QDM2Stream::synthfilt_build_sb_samples(GetBitContext *gb, int length, int s
* @param gb bitreader context
* @param length packet length in bits
*/
-void QDM2Stream::init_quantized_coeffs_elem0(int8 *quantized_coeffs, GetBitContext *gb, int length) {
+void QDM2Stream::init_quantized_coeffs_elem0(int8 *quantized_coeffs, Common::BitStream *gb, int length) {
int i, k, run, level, diff;
- if (BITS_LEFT(length,gb) < 16)
+ if ((length - gb->pos()) < 16)
return;
level = qdm2_get_vlc(gb, &_vlcTabLevel, 0, 2);
quantized_coeffs[0] = level;
for (i = 0; i < 7; ) {
- if (BITS_LEFT(length,gb) < 16)
+ if ((length - gb->pos()) < 16)
break;
run = qdm2_get_vlc(gb, &_vlcTabRun, 0, 1) + 1;
- if (BITS_LEFT(length,gb) < 16)
+ if ((length - gb->pos()) < 16)
break;
diff = qdm2_get_se_vlc(&_vlcTabDiff, gb, 2);
@@ -2470,13 +2405,13 @@ void QDM2Stream::init_quantized_coeffs_elem0(int8 *quantized_coeffs, GetBitConte
* @param gb bitreader context
* @param length packet length in bits
*/
-void QDM2Stream::init_tone_level_dequantization(GetBitContext *gb, int length) {
+void QDM2Stream::init_tone_level_dequantization(Common::BitStream *gb, int length) {
int sb, j, k, n, ch;
for (ch = 0; ch < _channels; ch++) {
init_quantized_coeffs_elem0(_quantizedCoeffs[ch][0], gb, length);
- if (BITS_LEFT(length,gb) < 16) {
+ if ((length - gb->pos()) < 16) {
memset(_quantizedCoeffs[ch][0], 0, 8);
break;
}
@@ -2487,11 +2422,11 @@ void QDM2Stream::init_tone_level_dequantization(GetBitContext *gb, int length) {
for (sb = 0; sb < n; sb++)
for (ch = 0; ch < _channels; ch++)
for (j = 0; j < 8; j++) {
- if (BITS_LEFT(length,gb) < 1)
+ if ((length - gb->pos()) < 1)
break;
- if (getBits1(gb)) {
+ if (gb->getBit()) {
for (k=0; k < 8; k++) {
- if (BITS_LEFT(length,gb) < 16)
+ if ((length - gb->pos()) < 16)
break;
_toneLevelIdxHi1[ch][sb][j][k] = qdm2_get_vlc(gb, &_vlcTabToneLevelIdxHi1, 0, 2);
}
@@ -2505,7 +2440,7 @@ void QDM2Stream::init_tone_level_dequantization(GetBitContext *gb, int length) {
for (sb = 0; sb < n; sb++)
for (ch = 0; ch < _channels; ch++) {
- if (BITS_LEFT(length,gb) < 16)
+ if ((length - gb->pos()) < 16)
break;
_toneLevelIdxHi2[ch][sb] = qdm2_get_vlc(gb, &_vlcTabToneLevelIdxHi2, 0, 2);
if (sb > 19)
@@ -2520,7 +2455,7 @@ void QDM2Stream::init_tone_level_dequantization(GetBitContext *gb, int length) {
for (sb = 0; sb < n; sb++) {
for (ch = 0; ch < _channels; ch++) {
for (j = 0; j < 8; j++) {
- if (BITS_LEFT(length,gb) < 16)
+ if ((length - gb->pos()) < 16)
break;
_toneLevelIdxMid[ch][sb][j] = qdm2_get_vlc(gb, &_vlcTabToneLevelIdxMid, 0, 2) - 32;
}
@@ -2534,10 +2469,10 @@ void QDM2Stream::init_tone_level_dequantization(GetBitContext *gb, int length) {
* @param node pointer to node with packet
*/
void QDM2Stream::process_subpacket_9(QDM2SubPNode *node) {
- GetBitContext gb;
int i, j, k, n, ch, run, level, diff;
- initGetBits(&gb, node->packet->data, node->packet->size*8);
+ Common::MemoryReadStream d(node->packet->data, node->packet->size*8);
+ Common::BitStream8MSB gb(&d);
n = coeff_per_sb_for_avg[_coeffPerSbSelect][QDM2_SB_USED(_subSampling) - 1] + 1; // same as averagesomething function
@@ -2570,9 +2505,8 @@ void QDM2Stream::process_subpacket_9(QDM2SubPNode *node) {
* @param length packet length in bits
*/
void QDM2Stream::process_subpacket_10(QDM2SubPNode *node, int length) {
- GetBitContext gb;
-
- initGetBits(&gb, ((node == NULL) ? _emptyBuffer : node->packet->data), ((node == NULL) ? 0 : node->packet->size*8));
+ Common::MemoryReadStream d(((node == NULL) ? _emptyBuffer : node->packet->data), ((node == NULL) ? 0 : node->packet->size*8));
+ Common::BitStream8MSB gb(&d);
if (length != 0) {
init_tone_level_dequantization(&gb, length);
@@ -2589,11 +2523,11 @@ void QDM2Stream::process_subpacket_10(QDM2SubPNode *node, int length) {
* @param length packet length in bit
*/
void QDM2Stream::process_subpacket_11(QDM2SubPNode *node, int length) {
- GetBitContext gb;
+ Common::MemoryReadStream d(((node == NULL) ? _emptyBuffer : node->packet->data), ((node == NULL) ? 0 : node->packet->size*8));
+ Common::BitStream8MSB gb(&d);
- initGetBits(&gb, ((node == NULL) ? _emptyBuffer : node->packet->data), ((node == NULL) ? 0 : node->packet->size*8));
if (length >= 32) {
- int c = getBits (&gb, 13);
+ int c = gb.getBits(13);
if (c > 3)
fill_coding_method_array(_toneLevelIdx, _toneLevelIdxTemp, _codingMethod,
@@ -2610,9 +2544,9 @@ void QDM2Stream::process_subpacket_11(QDM2SubPNode *node, int length) {
* @param length packet length in bits
*/
void QDM2Stream::process_subpacket_12(QDM2SubPNode *node, int length) {
- GetBitContext gb;
+ Common::MemoryReadStream d(((node == NULL) ? _emptyBuffer : node->packet->data), ((node == NULL) ? 0 : node->packet->size*8));
+ Common::BitStream8MSB gb(&d);
- initGetBits(&gb, ((node == NULL) ? _emptyBuffer : node->packet->data), ((node == NULL) ? 0 : node->packet->size*8));
synthfilt_build_sb_samples(&gb, length, 8, QDM2_SB_USED(_subSampling));
}
@@ -2652,7 +2586,6 @@ void QDM2Stream::process_synthesis_subpackets(QDM2SubPNode *list) {
*
*/
void QDM2Stream::qdm2_decode_super_block(void) {
- GetBitContext gb;
struct QDM2SubPacket header, *packet;
int i, packet_bytes, sub_packet_size, subPacketsD;
unsigned int next_index = 0;
@@ -2666,8 +2599,9 @@ void QDM2Stream::qdm2_decode_super_block(void) {
average_quantized_coeffs(); // average elements in quantized_coeffs[max_ch][10][8]
- initGetBits(&gb, _compressedData, _packetSize*8);
- qdm2_decode_sub_packet_header(&gb, &header);
+ Common::MemoryReadStream *d = new Common::MemoryReadStream(_compressedData, _packetSize*8);
+ Common::BitStream *gb = new Common::BitStream8MSB(d);
+ qdm2_decode_sub_packet_header(gb, &header);
if (header.type < 2 || header.type >= 8) {
_hasErrors = true;
@@ -2676,12 +2610,15 @@ void QDM2Stream::qdm2_decode_super_block(void) {
}
_superblocktype_2_3 = (header.type == 2 || header.type == 3);
- packet_bytes = (_packetSize - getBitsCount(&gb) / 8);
+ packet_bytes = (_packetSize - gb->pos() / 8);
- initGetBits(&gb, header.data, header.size*8);
+ delete gb;
+ delete d;
+ d = new Common::MemoryReadStream(header.data, header.size*8);
+ gb = new Common::BitStream8MSB(d);
if (header.type == 2 || header.type == 4 || header.type == 5) {
- int csum = 257 * getBits(&gb, 8) + 2 * getBits(&gb, 8);
+ int csum = 257 * gb->getBits(8) + 2 * gb->getBits(8);
csum = qdm2_packet_checksum(_compressedData, _packetSize, csum);
@@ -2708,8 +2645,11 @@ void QDM2Stream::qdm2_decode_super_block(void) {
_subPacketListA[i - 1].next = &_subPacketListA[i];
// seek to next block
- initGetBits(&gb, header.data, header.size*8);
- skipBits(&gb, next_index*8);
+ delete gb;
+ delete d;
+ d = new Common::MemoryReadStream(header.data, header.size*8);
+ gb = new Common::BitStream8MSB(d);
+ gb->getBits(next_index*8); // Skipping bits..
if (next_index >= header.size)
break;
@@ -2717,8 +2657,8 @@ void QDM2Stream::qdm2_decode_super_block(void) {
// decode subpacket
packet = &_subPackets[i];
- qdm2_decode_sub_packet_header(&gb, packet);
- next_index = packet->size + getBitsCount(&gb) / 8;
+ qdm2_decode_sub_packet_header(gb, packet);
+ next_index = packet->size + gb->pos() / 8;
sub_packet_size = ((packet->size > 0xff) ? 1 : 0) + packet->size + 2;
if (packet->type == 0)
@@ -2738,18 +2678,22 @@ void QDM2Stream::qdm2_decode_super_block(void) {
// add subpacket to related list
if (packet->type == 8) {
error("Unsupported packet type 8");
+ delete gb;
+ delete d;
return;
} else if (packet->type >= 9 && packet->type <= 12) {
// packets for MPEG Audio like Synthesis Filter
QDM2_LIST_ADD(_subPacketListD, subPacketsD, packet);
} else if (packet->type == 13) {
for (j = 0; j < 6; j++)
- _fftLevelExp[j] = getBits(&gb, 6);
+ _fftLevelExp[j] = gb->getBits(6);
} else if (packet->type == 14) {
for (j = 0; j < 6; j++)
- _fftLevelExp[j] = qdm2_get_vlc(&gb, &_fftLevelExpVlc, 0, 2);
+ _fftLevelExp[j] = qdm2_get_vlc(gb, &_fftLevelExpVlc, 0, 2);
} else if (packet->type == 15) {
error("Unsupported packet type 15");
+ delete gb;
+ delete d;
return;
} else if (packet->type >= 16 && packet->type < 48 && !fft_subpackets[packet->type - 16]) {
// packets for FFT
@@ -2767,6 +2711,8 @@ void QDM2Stream::qdm2_decode_super_block(void) {
process_subpacket_12(NULL, 0);
}
// ****************************************************************
+ delete gb;
+ delete d;
}
void QDM2Stream::qdm2_fft_init_coefficient(int sub_packet, int offset, int duration,
@@ -2782,7 +2728,7 @@ void QDM2Stream::qdm2_fft_init_coefficient(int sub_packet, int offset, int durat
_fftCoefsIndex++;
}
-void QDM2Stream::qdm2_fft_decode_tones(int duration, GetBitContext *gb, int b) {
+void QDM2Stream::qdm2_fft_decode_tones(int duration, Common::BitStream *gb, int b) {
int channel, stereo, phase, exp;
int local_int_4, local_int_8, stereo_phase, local_int_10;
int local_int_14, stereo_exp, local_int_20, local_int_28;
@@ -2823,8 +2769,8 @@ void QDM2Stream::qdm2_fft_decode_tones(int duration, GetBitContext *gb, int b) {
local_int_14 = (offset >> local_int_8);
if (_channels > 1) {
- channel = getBits1(gb);
- stereo = getBits1(gb);
+ channel = gb->getBit();
+ stereo = gb->getBit();
} else {
channel = 0;
stereo = 0;
@@ -2834,7 +2780,7 @@ void QDM2Stream::qdm2_fft_decode_tones(int duration, GetBitContext *gb, int b) {
exp += _fftLevelExp[fft_level_index_table[local_int_14]];
exp = (exp < 0) ? 0 : exp;
- phase = getBits(gb, 3);
+ phase = gb->getBits(3);
stereo_exp = 0;
stereo_phase = 0;
@@ -2859,7 +2805,6 @@ void QDM2Stream::qdm2_fft_decode_tones(int duration, GetBitContext *gb, int b) {
void QDM2Stream::qdm2_decode_fft_packets(void) {
int i, j, min, max, value, type, unknown_flag;
- GetBitContext gb;
if (_subPacketListB[0].packet == NULL)
return;
@@ -2892,7 +2837,8 @@ void QDM2Stream::qdm2_decode_fft_packets(void) {
return;
// decode FFT tones
- initGetBits(&gb, packet->data, packet->size*8);
+ Common::MemoryReadStream d(packet->data, packet->size*8);
+ Common::BitStream8MSB gb(&d);
if (packet->type >= 32 && packet->type < 48 && !fft_subpackets[packet->type - 16])
unknown_flag = 1;
@@ -2913,7 +2859,7 @@ void QDM2Stream::qdm2_decode_fft_packets(void) {
}
} else if (type == 46) {
for (j=0; j < 6; j++)
- _fftLevelExp[j] = getBits(&gb, 6);
+ _fftLevelExp[j] = gb.getBits(6);
for (j=0; j < 4; j++) {
qdm2_fft_decode_tones(j, &gb, unknown_flag);
}