diff options
author | D G Turner | 2012-04-12 14:52:31 +0100 |
---|---|---|
committer | D G Turner | 2012-04-13 07:37:29 +0100 |
commit | ce1f805212ca1c2b56692f8ce02eed3f40f252f7 (patch) | |
tree | ecb0ab96e9a7340788ab62fff9b45b0cc74099b0 /audio/decoders | |
parent | 50a9c6429d81b002c10d0ac05cabbc492716f180 (diff) | |
download | scummvm-rg350-ce1f805212ca1c2b56692f8ce02eed3f40f252f7.tar.gz scummvm-rg350-ce1f805212ca1c2b56692f8ce02eed3f40f252f7.tar.bz2 scummvm-rg350-ce1f805212ca1c2b56692f8ce02eed3f40f252f7.zip |
AUDIO: Fixes to restore QDM2 Codec function.
The Bitstream format is changed to 32LELSB and an error in the getVlc2()
function bitstream reading needed to be corrected to fix operation.
Diffstat (limited to 'audio/decoders')
-rw-r--r-- | audio/decoders/qdm2.cpp | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/audio/decoders/qdm2.cpp b/audio/decoders/qdm2.cpp index 0d4e0d1c50..a6315619d3 100644 --- a/audio/decoders/qdm2.cpp +++ b/audio/decoders/qdm2.cpp @@ -1225,22 +1225,26 @@ void ff_mpa_synth_filter(int16 *synth_buf_ptr, int *synth_buf_offset, * = (max_vlc_length + bits - 1) / bits */ static int getVlc2(Common::BitStream *s, int16 (*table)[2], int bits, int maxDepth) { - int index = s->getBits(bits); + int index = s->peekBits(bits); int code = table[index][0]; int n = table[index][1]; if (maxDepth > 1 && n < 0) { - index = s->getBits(-n) + code; + s->skip(bits); + int nbBits = -n; + index = s->peekBits(-n) + code; code = table[index][0]; n = table[index][1]; if(maxDepth > 2 && n < 0) { + s->skip(nbBits); index = s->getBits(-n) + code; code = table[index][0]; n = table[index][1]; } } + s->skip(n); return code; } @@ -2429,7 +2433,7 @@ void QDM2Stream::process_subpacket_9(QDM2SubPNode *node) { int i, j, k, n, ch, run, level, diff; Common::MemoryReadStream d(node->packet->data, node->packet->size*8); - Common::BitStream8MSB gb(&d); + Common::BitStream32LELSB gb(&d); n = coeff_per_sb_for_avg[_coeffPerSbSelect][QDM2_SB_USED(_subSampling) - 1] + 1; // same as averagesomething function @@ -2463,7 +2467,7 @@ void QDM2Stream::process_subpacket_9(QDM2SubPNode *node) { */ void QDM2Stream::process_subpacket_10(QDM2SubPNode *node, int length) { Common::MemoryReadStream d(((node == NULL) ? _emptyBuffer : node->packet->data), ((node == NULL) ? 0 : node->packet->size*8)); - Common::BitStream8MSB gb(&d); + Common::BitStream32LELSB gb(&d); if (length != 0) { init_tone_level_dequantization(&gb, length); @@ -2481,7 +2485,7 @@ void QDM2Stream::process_subpacket_10(QDM2SubPNode *node, int length) { */ void QDM2Stream::process_subpacket_11(QDM2SubPNode *node, int length) { Common::MemoryReadStream d(((node == NULL) ? _emptyBuffer : node->packet->data), ((node == NULL) ? 0 : node->packet->size*8)); - Common::BitStream8MSB gb(&d); + Common::BitStream32LELSB gb(&d); if (length >= 32) { int c = gb.getBits(13); @@ -2502,7 +2506,7 @@ void QDM2Stream::process_subpacket_11(QDM2SubPNode *node, int length) { */ void QDM2Stream::process_subpacket_12(QDM2SubPNode *node, int length) { Common::MemoryReadStream d(((node == NULL) ? _emptyBuffer : node->packet->data), ((node == NULL) ? 0 : node->packet->size*8)); - Common::BitStream8MSB gb(&d); + Common::BitStream32LELSB gb(&d); synthfilt_build_sb_samples(&gb, length, 8, QDM2_SB_USED(_subSampling)); } @@ -2557,7 +2561,7 @@ void QDM2Stream::qdm2_decode_super_block(void) { average_quantized_coeffs(); // average elements in quantized_coeffs[max_ch][10][8] Common::MemoryReadStream *d = new Common::MemoryReadStream(_compressedData, _packetSize*8); - Common::BitStream *gb = new Common::BitStream8MSB(d); + Common::BitStream *gb = new Common::BitStream32LELSB(d); //qdm2_decode_sub_packet_header header.type = gb->getBits(8); @@ -2591,7 +2595,7 @@ void QDM2Stream::qdm2_decode_super_block(void) { delete gb; delete d; d = new Common::MemoryReadStream(header.data, header.size*8); - gb = new Common::BitStream8MSB(d); + gb = new Common::BitStream32LELSB(d); if (header.type == 2 || header.type == 4 || header.type == 5) { int csum = 257 * gb->getBits(8) + 2 * gb->getBits(8); @@ -2624,7 +2628,7 @@ void QDM2Stream::qdm2_decode_super_block(void) { delete gb; delete d; d = new Common::MemoryReadStream(header.data, header.size*8); - gb = new Common::BitStream8MSB(d); + gb = new Common::BitStream32LELSB(d); gb->skip(next_index*8); if (next_index >= header.size) @@ -2834,7 +2838,7 @@ void QDM2Stream::qdm2_decode_fft_packets(void) { // decode FFT tones Common::MemoryReadStream d(packet->data, packet->size*8); - Common::BitStream8MSB gb(&d); + Common::BitStream32LELSB gb(&d); if (packet->type >= 32 && packet->type < 48 && !fft_subpackets[packet->type - 16]) unknown_flag = 1; |