diff options
Diffstat (limited to 'audio/decoders')
-rw-r--r-- | audio/decoders/qdm2.cpp | 69 |
1 files changed, 29 insertions, 40 deletions
diff --git a/audio/decoders/qdm2.cpp b/audio/decoders/qdm2.cpp index 4454fd08c9..dd04e01e38 100644 --- a/audio/decoders/qdm2.cpp +++ b/audio/decoders/qdm2.cpp @@ -1210,7 +1210,7 @@ QDM2Stream::QDM2Stream(Common::SeekableReadStream *extraData, DisposeAfterUse::F rndTableInit(); initNoiseSamples(); - _compressedData = new uint8[_packetSize]; + _compressedData = new uint8[_packetSize + FF_INPUT_BUFFER_PADDING_SIZE]; if (disposeExtraData == DisposeAfterUse::YES) delete extraData; @@ -1885,7 +1885,7 @@ void QDM2Stream::init_tone_level_dequantization(Common::BitStream32LELSB *gb, in 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::MemoryReadStream d(node->packet->data, node->packet->size + FF_INPUT_BUFFER_PADDING_SIZE); Common::BitStream32LELSB gb(&d); n = coeff_per_sb_for_avg[_coeffPerSbSelect][QDM2_SB_USED(_subSampling) - 1] + 1; // same as averagesomething function @@ -1919,7 +1919,7 @@ void QDM2Stream::process_subpacket_9(QDM2SubPNode *node) { * @param length packet length in bits */ 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::MemoryReadStream d(((node == NULL) ? _emptyBuffer : node->packet->data), ((node == NULL) ? 0 : node->packet->size + FF_INPUT_BUFFER_PADDING_SIZE)); Common::BitStream32LELSB gb(&d); if (length != 0) { @@ -1937,7 +1937,7 @@ void QDM2Stream::process_subpacket_10(QDM2SubPNode *node, int length) { * @param length packet length in bit */ 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::MemoryReadStream d(((node == NULL) ? _emptyBuffer : node->packet->data), ((node == NULL) ? 0 : node->packet->size + FF_INPUT_BUFFER_PADDING_SIZE)); Common::BitStream32LELSB gb(&d); if (length >= 32) { @@ -1958,7 +1958,7 @@ void QDM2Stream::process_subpacket_11(QDM2SubPNode *node, int length) { * @param length packet length in bits */ 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::MemoryReadStream d(((node == NULL) ? _emptyBuffer : node->packet->data), ((node == NULL) ? 0 : node->packet->size + FF_INPUT_BUFFER_PADDING_SIZE)); Common::BitStream32LELSB gb(&d); synthfilt_build_sb_samples(&gb, length, 8, QDM2_SB_USED(_subSampling)); @@ -2013,27 +2013,27 @@ 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::BitStream32LELSB *gb = new Common::BitStream32LELSB(d); + Common::MemoryReadStream packetStream(_compressedData, _packetSize + FF_INPUT_BUFFER_PADDING_SIZE); + Common::BitStream32LELSB packetBitStream(packetStream); //qdm2_decode_sub_packet_header - header.type = gb->getBits(8); + header.type = packetBitStream.getBits(8); if (header.type == 0) { header.size = 0; header.data = NULL; } else { - header.size = gb->getBits(8); + header.size = packetBitStream.getBits(8); if (header.type & 0x80) { header.size <<= 8; - header.size |= gb->getBits(8); + header.size |= packetBitStream.getBits(8); header.type &= 0x7f; } if (header.type == 0x7f) - header.type |= (gb->getBits(8) << 8); + header.type |= (packetBitStream.getBits(8) << 8); - header.data = &_compressedData[gb->pos() / 8]; + header.data = &_compressedData[packetBitStream.pos() / 8]; } if (header.type < 2 || header.type >= 8) { @@ -2043,15 +2043,13 @@ void QDM2Stream::qdm2_decode_super_block(void) { } _superblocktype_2_3 = (header.type == 2 || header.type == 3); - packet_bytes = (_packetSize - gb->pos() / 8); + packet_bytes = (_packetSize - packetBitStream.pos() / 8); - delete gb; - delete d; - d = new Common::MemoryReadStream(header.data, header.size*8); - gb = new Common::BitStream32LELSB(d); + Common::MemoryReadStream headerStream(header.data, header.size + FF_INPUT_BUFFER_PADDING_SIZE); + Common::BitStream32LELSB headerBitStream(headerStream); if (header.type == 2 || header.type == 4 || header.type == 5) { - int csum = 257 * gb->getBits(8) + 2 * gb->getBits(8); + int csum = 257 * headerBitStream.getBits(8) + 2 * headerBitStream.getBits(8); csum = qdm2_packet_checksum(_compressedData, _packetSize, csum); @@ -2077,41 +2075,37 @@ void QDM2Stream::qdm2_decode_super_block(void) { if (i > 0) { _subPacketListA[i - 1].next = &_subPacketListA[i]; - // seek to next block - delete gb; - delete d; - d = new Common::MemoryReadStream(header.data, header.size*8); - gb = new Common::BitStream32LELSB(d); - gb->skip(next_index*8); - if (next_index >= header.size) break; + + // seek to next block + headerBitStream.skip(next_index * 8 - headerBitStream.pos()); } // decode subpacket packet = &_subPackets[i]; //qdm2_decode_sub_packet_header - packet->type = gb->getBits(8); + packet->type = headerBitStream.getBits(8); if (packet->type == 0) { packet->size = 0; packet->data = NULL; } else { - packet->size = gb->getBits(8); + packet->size = headerBitStream.getBits(8); if (packet->type & 0x80) { packet->size <<= 8; - packet->size |= gb->getBits(8); + packet->size |= headerBitStream.getBits(8); packet->type &= 0x7f; } if (packet->type == 0x7f) - packet->type |= (gb->getBits(8) << 8); + packet->type |= (headerBitStream.getBits(8) << 8); - packet->data = &header.data[gb->pos() / 8]; + packet->data = &header.data[headerBitStream.pos() / 8]; } - next_index = packet->size + gb->pos() / 8; + next_index = packet->size + headerBitStream.pos() / 8; sub_packet_size = ((packet->size > 0xff) ? 1 : 0) + packet->size + 2; if (packet->type == 0) @@ -2131,22 +2125,18 @@ 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] = gb->getBits(6); + _fftLevelExp[j] = headerBitStream.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(&headerBitStream, &_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 @@ -2164,8 +2154,6 @@ 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, @@ -2290,7 +2278,7 @@ void QDM2Stream::qdm2_decode_fft_packets(void) { return; // decode FFT tones - Common::MemoryReadStream d(packet->data, packet->size*8); + Common::MemoryReadStream d(packet->data, packet->size + FF_INPUT_BUFFER_PADDING_SIZE); Common::BitStream32LELSB gb(&d); if (packet->type >= 32 && packet->type < 48 && !fft_subpackets[packet->type - 16]) @@ -2514,6 +2502,7 @@ bool QDM2Stream::qdm2_decodeFrame(Common::SeekableReadStream &in, QueuingAudioSt if (!in.eos()) { in.read(_compressedData, _packetSize); + memset(_compressedData + _packetSize, 0, FF_INPUT_BUFFER_PADDING_SIZE); debug(1, "QDM2Stream::qdm2_decodeFrame constructed input data"); } |