[Scummvm-git-logs] scummvm-tools master -> 332a623e3cf9300d9c76715af493fca98ed1ee18
aquadran
noreply at scummvm.org
Mon Nov 15 23:08:15 UTC 2021
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm-tools' repo located at https://github.com/scummvm/scummvm-tools .
Summary:
332a623e3c SCUMM: Removed support for compressing BUN files. It's no longer supported with reworked digital imuse.
Commit: 332a623e3cf9300d9c76715af493fca98ed1ee18
https://github.com/scummvm/scummvm-tools/commit/332a623e3cf9300d9c76715af493fca98ed1ee18
Author: PaweÅ KoÅodziejski (aquadran at gmail.com)
Date: 2021-11-15T22:32:03+01:00
Commit Message:
SCUMM: Removed support for compressing BUN files. It's no longer supported with reworked digital imuse.
Changed paths:
R engines/scumm/compress_scumm_bun.cpp
R engines/scumm/compress_scumm_bun.h
Makefile.common
NEWS
tools.cpp
diff --git a/Makefile.common b/Makefile.common
index b50f1af..ea99c99 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -201,7 +201,6 @@ tools_OBJS := \
engines/queen/compress_queen.o \
engines/saga/compress_saga.o \
engines/sci/compress_sci.o \
- engines/scumm/compress_scumm_bun.o \
engines/scumm/compress_scumm_san.o \
engines/scumm/compress_scumm_sou.o \
engines/sword1/compress_sword1.o \
diff --git a/NEWS b/NEWS
index aba83d7..602a813 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,7 @@ For a more comprehensive changelog of the latest experimental code, see:
2.6.0 (XXXX-XX-XX)
- Added a tool to extract Sanitarium resource packs.
+ - Removed support for compressing BUN files.
2.5.0 (2021-10-09)
- Added tool for exctracting NGI's .nl archives
diff --git a/engines/scumm/compress_scumm_bun.cpp b/engines/scumm/compress_scumm_bun.cpp
deleted file mode 100644
index 7bd9b49..0000000
--- a/engines/scumm/compress_scumm_bun.cpp
+++ /dev/null
@@ -1,1192 +0,0 @@
-/* ScummVM Tools
- *
- * ScummVM Tools is the legal property of its developers, whose
- * names are too numerous to list here. Please refer to the
- * COPYRIGHT file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-/* compressor for bundle files */
-
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-
-#include "common/util.h"
-#include "common/endian.h"
-#include "compress_scumm_bun.h"
-
-/*
- * The "IMC" codec below (see cases 13 & 15 in decompressCodec) is actually a
- * variant of the IMA codec, see also
- * <http://www.multimedia.cx/simpleaudio.html>
- *
- * It is somewhat different, though: the standard ADPCM codecs use a fixed
- * size for their data packets (4 bits), while the codec implemented here
- * varies the size of each "packet" between 2 and 7 bits.
- */
-
-static byte _imcTableEntryBitCount[89];
-
-static const int16 imcTable[89] = {
- 7, 8, 9, 10, 11, 12, 13, 14,
- 16, 17, 19, 21, 23, 25, 28, 31,
- 34, 37, 41, 45, 50, 55, 60, 66,
- 73, 80, 88, 97, 107, 118, 130, 143,
- 157, 173, 190, 209, 230, 253, 279, 307,
- 337, 371, 408, 449, 494, 544, 598, 658,
- 724, 796, 876, 963, 1060, 1166, 1282, 1411,
- 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024,
- 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484,
- 7132, 7845, 8630, 9493,10442,11487,12635,13899,
- 15289,16818,18500,20350,22385,24623,27086,29794,
- 32767
-};
-
-static const byte imxOtherTable[6][64] = {
- {
- 0xFF,
- 4
- },
-
- {
- 0xFF, 0xFF,
- 2, 8
- },
-
- {
- 0xFF, 0xFF, 0xFF, 0xFF,
- 1, 2, 4, 6
- },
-
- {
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 1, 2, 4, 6, 8, 12, 16, 32
- },
-
- {
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 1, 2, 4, 6, 8, 10, 12, 14,
- 16, 18, 20, 22, 24, 26, 28, 32
- },
-
- {
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 1, 2, 3, 4, 5, 6, 7, 8,
- 9, 10, 11, 12, 13, 14, 15, 16,
- 17, 18, 19, 20, 21, 22, 23, 24,
- 25, 26, 27, 28, 29, 30, 31, 32
- }
-};
-
-void initializeImcTables() {
- int pos;
-
- for (pos = 0; pos < ARRAYSIZE(imcTable); ++pos) {
- byte put = 0;
- int32 tableValue = ((imcTable[pos] * 4) / 7) / 2;
- while (tableValue != 0) {
- tableValue /= 2;
- put++;
- }
- if (put < 2) {
- put = 2;
- }
- if (put > 7) {
- put = 7;
- }
- _imcTableEntryBitCount[pos] = put;
- }
-}
-
-#define NextBit \
- do { \
- bit = mask & 1; \
- mask >>= 1; \
- if (!--bitsleft) { \
- mask = READ_LE_UINT16(srcptr); \
- srcptr += 2; \
- bitsleft = 16; \
- } \
- } while (0)
-
-int32 CompressScummBun::compDecode(byte *src, byte *dst) {
- byte *result, *srcptr = src, *dstptr = dst;
- int data, size, bit, bitsleft = 16, mask = READ_LE_UINT16(srcptr);
- srcptr += 2;
-
- for (;;) {
- NextBit;
- if (bit) {
- *dstptr++ = *srcptr++;
- } else {
- NextBit;
- if (!bit) {
- NextBit;
- size = bit << 1;
- NextBit;
- size = (size | bit) + 3;
- data = *srcptr++ | 0xffffff00;
- } else {
- data = *srcptr++;
- size = *srcptr++;
-
- data |= 0xfffff000 + ((size & 0xf0) << 4);
- size = (size & 0x0f) + 3;
-
- if (size == 3)
- if (((*srcptr++) + 1) == 1)
- return (int32)(dstptr - dst);
- }
- result = dstptr + data;
- while (size--)
- *dstptr++ = *result++;
- }
- }
-}
-#undef NextBit
-
-int32 CompressScummBun::decompressCodec(int32 codec, byte *comp_input, byte *comp_output, int32 input_size) {
- int32 output_size, channels;
- int32 offset1, offset2, offset3, length, k, c, s, j, r, t, z;
- byte *src, *t_table, *p, *ptr;
- byte t_tmp1, t_tmp2;
-
- switch (codec) {
- case 0:
- memcpy(comp_output, comp_input, input_size);
- output_size = input_size;
- break;
-
- case 1:
- output_size = compDecode(comp_input, comp_output);
- break;
-
- case 2:
- output_size = compDecode(comp_input, comp_output);
- p = comp_output;
- for (z = 1; z < output_size; z++)
- p[z] += p[z - 1];
- break;
-
- case 3:
- output_size = compDecode(comp_input, comp_output);
- p = comp_output;
- for (z = 2; z < output_size; z++)
- p[z] += p[z - 1];
- for (z = 1; z < output_size; z++)
- p[z] += p[z - 1];
- break;
-
- case 4:
- output_size = compDecode(comp_input, comp_output);
- p = comp_output;
- for (z = 2; z < output_size; z++)
- p[z] += p[z - 1];
- for (z = 1; z < output_size; z++)
- p[z] += p[z - 1];
-
- t_table = (byte *)malloc(output_size);
- memset(t_table, 0, output_size);
-
- src = comp_output;
- length = (output_size << 3) / 12;
- k = 0;
- if (length > 0) {
- c = -12;
- s = 0;
- j = 0;
- do {
- ptr = src + length + (k >> 1);
- t_tmp2 = src[j];
- if (k & 1) {
- r = c >> 3;
- t_table[r + 2] = ((t_tmp2 & 0x0f) << 4) | (ptr[1] >> 4);
- t_table[r + 1] = (t_tmp2 & 0xf0) | (t_table[r + 1]);
- } else {
- r = s >> 3;
- t_table[r + 0] = ((t_tmp2 & 0x0f) << 4) | (ptr[0] & 0x0f);
- t_table[r + 1] = t_tmp2 >> 4;
- }
- s += 12;
- c += 12;
- k++;
- j++;
- } while (k < length);
- }
- offset1 = ((length - 1) * 3) >> 1;
- t_table[offset1 + 1] = (t_table[offset1 + 1]) | (src[length - 1] & 0xf0);
- memcpy(src, t_table, output_size);
- free(t_table);
- break;
-
- case 5:
- output_size = compDecode(comp_input, comp_output);
- p = comp_output;
- for (z = 2; z < output_size; z++)
- p[z] += p[z - 1];
- for (z = 1; z < output_size; z++)
- p[z] += p[z - 1];
-
- t_table = (byte *)malloc(output_size);
- memset(t_table, 0, output_size);
-
- src = comp_output;
- length = (output_size << 3) / 12;
- k = 1;
- c = 0;
- s = 12;
- t_table[0] = src[length] >> 4;
- t = length + k;
- j = 1;
- if (t > k) {
- do {
- t_tmp1 = *(src + length + (k >> 1));
- t_tmp2 = src[j - 1];
- if (k & 1) {
- r = c >> 3;
- t_table[r + 0] = (t_tmp2 & 0xf0) | t_table[r];
- t_table[r + 1] = ((t_tmp2 & 0x0f) << 4) | (t_tmp1 & 0x0f);
- } else {
- r = s >> 3;
- t_table[r + 0] = t_tmp2 >> 4;
- t_table[r - 1] = ((t_tmp2 & 0x0f) << 4) | (t_tmp1 >> 4);
- }
- s += 12;
- c += 12;
- k++;
- j++;
- } while (k < t);
- }
- memcpy(src, t_table, output_size);
- free(t_table);
- break;
-
- case 6:
- output_size = compDecode(comp_input, comp_output);
- p = comp_output;
- for (z = 2; z < output_size; z++)
- p[z] += p[z - 1];
- for (z = 1; z < output_size; z++)
- p[z] += p[z - 1];
-
- t_table = (byte *)malloc(output_size);
- memset(t_table, 0, output_size);
-
- src = comp_output;
- length = (output_size << 3) / 12;
- k = 0;
- c = 0;
- j = 0;
- s = -12;
- t_table[0] = src[output_size - 1];
- t_table[output_size - 1] = src[length - 1];
- t = length - 1;
- if (t > 0) {
- do {
- t_tmp1 = *(src + length + (k >> 1));
- t_tmp2 = src[j];
- if (k & 1) {
- r = s >> 3;
- t_table[r + 2] = (t_tmp2 & 0xf0) | t_table[r + 2];
- t_table[r + 3] = ((t_tmp2 & 0x0f) << 4) | (t_tmp1 >> 4);
- } else {
- r = c >> 3;
- t_table[r + 2] = t_tmp2 >> 4;
- t_table[r + 1] = ((t_tmp2 & 0x0f) << 4) | (t_tmp1 & 0x0f);
- }
- s += 12;
- c += 12;
- k++;
- j++;
- } while (k < t);
- }
- memcpy(src, t_table, output_size);
- free(t_table);
- break;
-
- case 10:
- output_size = compDecode(comp_input, comp_output);
- p = comp_output;
- for (z = 2; z < output_size; z++)
- p[z] += p[z - 1];
- for (z = 1; z < output_size; z++)
- p[z] += p[z - 1];
-
- t_table = (byte *)malloc(output_size);
- memcpy(t_table, p, output_size);
-
- offset1 = output_size / 3;
- offset2 = offset1 << 1;
- offset3 = offset2;
- src = comp_output;
-
- while (offset1--) {
- offset2 -= 2;
- offset3--;
- t_table[offset2 + 0] = src[offset1];
- t_table[offset2 + 1] = src[offset3];
- }
-
- src = comp_output;
- length = (output_size << 3) / 12;
- k = 0;
- if (length > 0) {
- c = -12;
- s = 0;
- do {
- j = length + (k >> 1);
- t_tmp1 = t_table[k];
- if (k & 1) {
- r = c >> 3;
- t_tmp2 = t_table[j + 1];
- src[r + 2] = ((t_tmp1 & 0x0f) << 4) | (t_tmp2 >> 4);
- src[r + 1] = (src[r + 1]) | (t_tmp1 & 0xf0);
- } else {
- r = s >> 3;
- t_tmp2 = t_table[j];
- src[r + 0] = ((t_tmp1 & 0x0f) << 4) | (t_tmp2 & 0x0f);
- src[r + 1] = t_tmp1 >> 4;
- }
- s += 12;
- c += 12;
- k++;
- } while (k < length);
- }
- offset1 = ((length - 1) * 3) >> 1;
- src[offset1 + 1] = (t_table[length] & 0xf0) | src[offset1 + 1];
- free(t_table);
- break;
-
- case 11:
- output_size = compDecode(comp_input, comp_output);
- p = comp_output;
- for (z = 2; z < output_size; z++)
- p[z] += p[z - 1];
- for (z = 1; z < output_size; z++)
- p[z] += p[z - 1];
-
- t_table = (byte *)malloc(output_size);
- memcpy(t_table, p, output_size);
-
- offset1 = output_size / 3;
- offset2 = offset1 << 1;
- offset3 = offset2;
- src = comp_output;
-
- while (offset1--) {
- offset2 -= 2;
- offset3--;
- t_table[offset2 + 0] = src[offset1];
- t_table[offset2 + 1] = src[offset3];
- }
-
- src = comp_output;
- length = (output_size << 3) / 12;
- k = 1;
- c = 0;
- s = 12;
- t_tmp1 = t_table[length] >> 4;
- src[0] = t_tmp1;
- t = length + k;
- if (t > k) {
- do {
- j = length + (k >> 1);
- t_tmp1 = t_table[k - 1];
- t_tmp2 = t_table[j];
- if (k & 1) {
- r = c >> 3;
- src[r + 0] = (src[r]) | (t_tmp1 & 0xf0);
- src[r + 1] = ((t_tmp1 & 0x0f) << 4) | (t_tmp2 & 0x0f);
- } else {
- r = s >> 3;
- src[r + 0] = t_tmp1 >> 4;
- src[r - 1] = ((t_tmp1 & 0x0f) << 4) | (t_tmp2 >> 4);
- }
- s += 12;
- c += 12;
- k++;
- } while (k < t);
- }
- free(t_table);
- break;
-
- case 12:
- output_size = compDecode(comp_input, comp_output);
- p = comp_output;
- for (z = 2; z < output_size; z++)
- p[z] += p[z - 1];
- for (z = 1; z < output_size; z++)
- p[z] += p[z - 1];
-
- t_table = (byte *)malloc(output_size);
- memcpy(t_table, p, output_size);
-
- offset1 = output_size / 3;
- offset2 = offset1 << 1;
- offset3 = offset2;
- src = comp_output;
-
- while (offset1--) {
- offset2 -= 2;
- offset3--;
- t_table[offset2 + 0] = src[offset1];
- t_table[offset2 + 1] = src[offset3];
- }
-
- src = comp_output;
- length = (output_size << 3) / 12;
- k = 0;
- c = 0;
- s = -12;
- src[0] = t_table[output_size - 1];
- src[output_size - 1] = t_table[length - 1];
- t = length - 1;
- if (t > 0) {
- do {
- j = length + (k >> 1);
- t_tmp1 = t_table[k];
- t_tmp2 = t_table[j];
- if (k & 1) {
- r = s >> 3;
- src[r + 2] = (src[r + 2]) | (t_tmp1 & 0xf0);
- src[r + 3] = ((t_tmp1 & 0x0f) << 4) | (t_tmp2 >> 4);
- } else {
- r = c >> 3;
- src[r + 2] = t_tmp1 >> 4;
- src[r + 1] = ((t_tmp1 & 0x0f) << 4) | (t_tmp2 & 0x0f);
- }
- s += 12;
- c += 12;
- k++;
- } while (k < t);
- }
- free(t_table);
- break;
-
- case 13:
- case 15:
- if (codec == 13) {
- channels = 1;
- } else {
- channels = 2;
- }
-
- {
- // Decoder for the the IMA ADPCM variants used in COMI.
- // Contrary to regular IMA ADPCM, this codec uses a variable
- // bitsize for the encoded data.
-
- const int MAX_CHANNELS = 2;
- int32 outputSamplesLeft;
- int32 destPos;
- int16 firstWord;
- byte initialTablePos[MAX_CHANNELS] = {0, 0};
- //int32 initialimcTableEntry[MAX_CHANNELS] = {7, 7};
- int32 initialOutputWord[MAX_CHANNELS] = {0, 0};
- int32 totalBitOffset, curTablePos, outputWord;
- byte *dst;
- int i;
-
- // We only support mono and stereo
- assert(channels == 1 || channels == 2);
-
- src = comp_input;
- dst = comp_output;
- output_size = 0x2000;
- outputSamplesLeft = 0x1000;
-
- // Every data packet contains 0x2000 bytes of audio data
- // when extracted. In order to encode bigger data sets,
- // one has to split the data into multiple blocks.
- //
- // Every block starts with a 2 byte word. If that word is
- // non-zero, it indicates the size of a block of raw audio
- // data (not encoded) following it. That data we simply copy
- // to the output buffer and the proceed by decoding the
- // remaining data.
- //
- // If on the other hand the word is zero, then what follows
- // are 7*channels bytes containing seed data for the decoder.
- firstWord = READ_BE_UINT16(src);
- src += 2;
- if (firstWord != 0) {
- // Copy raw data
- memcpy(dst, src, firstWord);
- dst += firstWord;
- src += firstWord;
- assert((firstWord & 1) == 0);
- outputSamplesLeft -= firstWord / 2;
- } else {
- // Read the seed values for the decoder.
- for (i = 0; i < channels; i++) {
- initialTablePos[i] = *src;
- src += 1;
- /*initialimcTableEntry[i] =*/ READ_BE_UINT32(src);
- src += 4;
- initialOutputWord[i] = READ_BE_UINT32(src);
- src += 4;
- }
- }
-
- totalBitOffset = 0;
- // The channels are encoded separately.
- for (int chan = 0; chan < channels; chan++) {
- // Read initial state (this makes it possible for the data stream
- // to be split & spread across multiple data chunks.
- curTablePos = initialTablePos[chan];
- //imcTableEntry = initialimcTableEntry[chan];
- outputWord = initialOutputWord[chan];
-
- // We need to interleave the channels in the output; we achieve
- // that by using a variables dest offset:
- destPos = chan * 2;
-
- const int bound = (channels == 1)
- ? outputSamplesLeft
- : ((chan == 0)
- ? (outputSamplesLeft+1) / 2
- : outputSamplesLeft / 2);
- for (i = 0; i < bound; ++i) {
- // Determine the size (in bits) of the next data packet
- const int32 curTableEntryBitCount = _imcTableEntryBitCount[curTablePos];
- assert(2 <= curTableEntryBitCount && curTableEntryBitCount <= 7);
-
- // Read the next data packet
- const byte *readPos = src + (totalBitOffset >> 3);
- const uint16 readWord = (uint16)(READ_BE_UINT16(readPos) << (totalBitOffset & 7));
- const byte packet = (byte)(readWord >> (16 - curTableEntryBitCount));
-
- // Advance read position to the next data packet
- totalBitOffset += curTableEntryBitCount;
-
- // Decode the data packet into a delta value for the output signal.
- const byte signBitMask = (1 << (curTableEntryBitCount - 1));
- const byte dataBitMask = (signBitMask - 1);
- const byte data = (packet & dataBitMask);
-
- int32 delta = imcTable[curTablePos] * (2 * data + 1) >> (curTableEntryBitCount - 1);
-
- // The topmost bit in the data packet tells is a sign bit
- if ((packet & signBitMask) != 0) {
- delta = -delta;
- }
-
- // Accumulate the delta onto the output data
- outputWord += delta;
-
- // Clip outputWord to 16 bit signed, and write it into the destination stream
- if (outputWord > 0x7fff)
- outputWord = 0x7fff;
- if (outputWord < -0x8000)
- outputWord = -0x8000;
- WRITE_BE_UINT16(dst + destPos, outputWord);
- destPos += channels << 1;
-
- // Adjust the curTablePos
- curTablePos += (int8)imxOtherTable[curTableEntryBitCount - 2][data];
- if (curTablePos < 0)
- curTablePos = 0;
- else if (curTablePos >= ARRAYSIZE(imcTable))
- curTablePos = ARRAYSIZE(imcTable) - 1;
- }
- }
- }
- break;
-
- default:
- print("decompressCodec() Unknown codec %d!", (int)codec);
- output_size = 0;
- break;
- }
-
- return output_size;
-}
-
-void CompressScummBun::encodeWaveWithFlac(char *filename) {
- char fbuf[2048];
- char fbuf2[2048];
- sprintf(fbuf, "%s.wav", filename);
- sprintf(fbuf2, "%s.fla", filename);
- encodeAudio(fbuf, false, -1, fbuf2, AUDIO_FLAC);
-}
-
-void CompressScummBun::encodeWaveWithOgg(char *filename) {
- char fbuf[2048];
- char fbuf2[2048];
- sprintf(fbuf, "%s.wav", filename);
- sprintf(fbuf2, "%s.ogg", filename);
- encodeAudio(fbuf, false, -1, fbuf2, AUDIO_VORBIS);
-}
-
-void CompressScummBun::encodeWaveWithLame(char *filename) {
- char fbuf[2048];
- char fbuf2[2048];
-
- sprintf(fbuf, "%s.wav", filename);
- sprintf(fbuf2, "%s.mp3", filename);
- encodeAudio(fbuf, false, -1, fbuf2, AUDIO_MP3);
-}
-
-void CompressScummBun::writeWaveHeader(int s_size, int rate, int chan) {
- int bits = 16;
- byte wav[44];
- memset(wav, 0, 44);
- wav[0] = 'R';
- wav[1] = 'I';
- wav[2] = 'F';
- wav[3] = 'F';
- wav[4] = (s_size + 36) & 0xff;
- wav[5] = ((s_size + 36) >> 8) & 0xff;
- wav[6] = ((s_size + 36) >> 16) & 0xff;
- wav[7] = ((s_size + 36) >> 24) & 0xff;
- wav[8] = 'W';
- wav[9] = 'A';
- wav[10] = 'V';
- wav[11] = 'E';
- wav[12] = 'f';
- wav[13] = 'm';
- wav[14] = 't';
- wav[15] = 0x20;
- wav[16] = 16;
- wav[20] = 1;
- wav[22] = chan;
- wav[24] = rate & 0xff;
- wav[25] = (rate >> 8) & 0xff;
- wav[26] = (rate >> 16) & 0xff;
- wav[27] = (rate >> 24) & 0xff;
- wav[28] = (rate * chan * (bits / 8)) & 0xff;
- wav[29] = ((rate * chan * (bits / 8))>> 8) & 0xff;
- wav[30] = ((rate * chan * (bits / 8)) >> 16) & 0xff;
- wav[31] = ((rate * chan * (bits / 8)) >> 24) & 0xff;
- wav[32] = (chan * (bits / 8)) & 0xff;
- wav[33] = ((chan * (bits / 8)) >> 8) & 0xff;
- wav[34] = bits;
- wav[36] = 'd';
- wav[37] = 'a';
- wav[38] = 't';
- wav[39] = 'a';
- wav[40] = s_size & 0xff;
- wav[41] = (s_size >> 8) & 0xff;
- wav[42] = (s_size >> 16) & 0xff;
- wav[43] = (s_size >> 24) & 0xff;
-
- _waveTmpFile.seek(0, SEEK_SET);
- if (_waveTmpFile.write(wav, 44) != 44) {
- error("error writing temp wave file");
- }
- _waveTmpFile.close();
-}
-
-void CompressScummBun::writeToTempWave(char *fileName, byte *output_data, unsigned int size, bool littleEndian) {
- if (!_waveTmpFile.isOpen()) {
- _waveTmpFile.open(fileName, "wb");
- byte wav[44];
- memset(wav, 0, 44);
- _waveTmpFile.write(output_data, 44);
- _waveDataSize = 0;
- }
- if (!littleEndian) {
- for (unsigned int j = 0; j < size - 1; j += 2) {
- byte tmp = output_data[j + 0];
- output_data[j + 0] = output_data[j + 1];
- output_data[j + 1] = tmp;
- }
- }
- _waveTmpFile.write(output_data, size);
- _waveDataSize += size;
-}
-
-typedef struct { int offset, size, codec; } CompTable;
-
-byte *CompressScummBun::decompressBundleSound(int index, Common::File &input, int32 &finalSize, bool &rawMuse) {
- byte compOutput[0x2000];
- int i;
-
- input.seek(_bundleTable[index].offset, SEEK_SET);
-
- uint32 tag = input.readUint32BE();
- if (tag == 'iMUS') {
- input.seek(_bundleTable[index].offset, SEEK_SET);
- finalSize = _bundleTable[index].size;
- byte *compFinal = (byte *)malloc(finalSize);
- input.read_throwsOnError(compFinal, finalSize);
- rawMuse = true;
- return compFinal;
- }
-
- if (tag != 'COMP')
- return NULL;
- rawMuse = false;
- assert(tag == 'COMP');
- int numCompItems = input.readUint32BE();
- input.seek(8, SEEK_CUR);
-
- CompTable *compTable = (CompTable *)malloc(sizeof(CompTable) * numCompItems);
- int32 maxSize = 0;
- for (i = 0; i < numCompItems; i++) {
- compTable[i].offset = input.readUint32BE();
- compTable[i].size = input.readUint32BE();
- compTable[i].codec = input.readUint32BE();
- input.seek(4, SEEK_CUR);
- if (compTable[i].size > maxSize)
- maxSize = compTable[i].size;
- }
- // CMI hack: one more byte at the end of input buffer
- byte *compInput = (byte *)malloc(maxSize + 1);
- byte *compFinal = (byte *)malloc(numCompItems * 0x2000);
-
- finalSize = 0;
-
- for (i = 0; i < numCompItems; i++) {
- compInput[compTable[i].size] = 0;
- input.seek(_bundleTable[index].offset + compTable[i].offset, SEEK_SET);
- input.read_throwsOnError(compInput, compTable[i].size);
- int outputSize = decompressCodec(compTable[i].codec, compInput, compOutput, compTable[i].size);
- assert(outputSize <= 0x2000);
- memcpy(compFinal + finalSize, compOutput, outputSize);
- finalSize += outputSize;
- }
-
- free(compInput);
- free(compTable);
-
- return compFinal;
-}
-
-byte *CompressScummBun::convertTo16bit(byte *ptr, int inputSize, int &outputSize, int bits, int freq, int channels) {
- outputSize = inputSize;
- if (bits == 8)
- outputSize *= 2;
- if (bits == 12)
- outputSize = (outputSize / 3) * 4;
-
- byte *outputBuf = (byte *)malloc(outputSize);
- if (bits == 8) {
- byte *buf = outputBuf;
- byte *src = ptr;
- for (int i = 0; i < inputSize; i++) {
- uint16 val = (*src++ - 0x80) << 8;
- *buf++ = (byte)(val >> 8);
- *buf++ = (byte)val;
- }
- }
- if (bits == 12) {
- int loop_size = inputSize / 3;
- byte *decoded = outputBuf;
- byte *source = ptr;
- uint32 value;
-
- while (loop_size--) {
- byte v1 = *source++;
- byte v2 = *source++;
- byte v3 = *source++;
- value = ((((v2 & 0x0f) << 8) | v1) << 4) - 0x8000;
- *decoded++ = (byte)((value >> 8) & 0xff);
- *decoded++ = (byte)(value & 0xff);
- value = ((((v2 & 0xf0) << 4) | v3) << 4) - 0x8000;
- *decoded++ = (byte)((value >> 8) & 0xff);
- *decoded++ = (byte)(value & 0xff);
- }
- }
- if (bits == 16) {
- int loop_size = inputSize / 2;
- byte *buf = outputBuf;
- byte *src = ptr;
- while (loop_size--) {
- *buf++ = *src++;
- *buf++ = *src++;
- }
- }
-
- return outputBuf;
-}
-
-void CompressScummBun::countMapElements(byte *ptr, int &numRegions, int &numJumps, int &numSyncs, int &numMarkers) {
- uint32 tag;
- int32 size = 0;
-
- do {
- tag = READ_BE_UINT32(ptr); ptr += 4;
- switch(tag) {
- case 'TEXT':
- if (!scumm_stricmp((const char *)(ptr + 8), "exit"))
- numMarkers++;
- size = READ_BE_UINT32(ptr); ptr += size + 4;
- break;
- case 'STOP':
- case 'FRMT':
- case 'DATA':
- size = READ_BE_UINT32(ptr); ptr += size + 4;
- break;
- case 'REGN':
- numRegions++;
- size = READ_BE_UINT32(ptr); ptr += size + 4;
- break;
- case 'JUMP':
- numJumps++;
- size = READ_BE_UINT32(ptr); ptr += size + 4;
- break;
- case 'SYNC':
- numSyncs++;
- size = READ_BE_UINT32(ptr); ptr += size + 4;
- break;
- default:
- error("countMapElements() Unknown tag of Map");
- }
- } while (tag != 'DATA');
-}
-
-struct Region {
- int32 offset;
- int32 length;
-};
-
-struct Jump {
- int32 offset;
- int32 dest;
- byte hookId;
- int16 fadeDelay;
-};
-
-struct Sync {
- int32 size;
- byte *ptr;
-};
-
-struct Marker {
- int32 pos;
- int32 length;
- char *ptr;
-};
-
-static Region *_region;
-static int _numRegions;
-
-void CompressScummBun::writeRegions(byte *ptr, int bits, int freq, int channels, const char *dir, char *filename, Common::File &output, bool littleEndian) {
- char tmpPath[200];
-
- for (int l = 0; l < _numRegions; l++) {
- int outputSize = 0;
- int size = _region[l].length;
- int offset = _region[l].offset;
- byte *outputData = convertTo16bit(ptr + offset, size, outputSize, bits, freq, channels);
- sprintf(tmpPath, "%s%s_reg%03d.wav", dir, filename, l);
- writeToTempWave(tmpPath, outputData, outputSize, littleEndian);
- writeWaveHeader(_waveDataSize, freq, channels);
- free(outputData);
- sprintf(tmpPath, "%s%s_reg%03d", dir, filename, l);
-
- switch (_format) {
- case AUDIO_MP3:
- encodeWaveWithLame(tmpPath);
- break;
- case AUDIO_VORBIS:
- encodeWaveWithOgg(tmpPath);
- break;
- case AUDIO_FLAC:
- encodeWaveWithFlac(tmpPath);
- break;
- default:
- error("Unknown encoding method");
- }
-
- sprintf(tmpPath, "%s%s_reg%03d.wav", dir, filename, l);
- Common::removeFile(tmpPath);
-
- int32 startPos = output.pos();
- switch (_format) {
- case AUDIO_MP3:
- sprintf(_cbundleTable[_cbundleCurIndex].filename, "%s_reg%03d.mp3", filename, l);
- sprintf(tmpPath, "%s%s_reg%03d.mp3", dir, filename, l);
- break;
- case AUDIO_VORBIS:
- sprintf(_cbundleTable[_cbundleCurIndex].filename, "%s_reg%03d.ogg", filename, l);
- sprintf(tmpPath, "%s%s_reg%03d.ogg", dir, filename, l);
- break;
- case AUDIO_FLAC:
- sprintf(_cbundleTable[_cbundleCurIndex].filename, "%s_reg%03d.fla", filename, l);
- sprintf(tmpPath, "%s%s_reg%03d.fla", dir, filename, l);
- break;
- default:
- error("Unknown encoding method");
- }
- _cbundleTable[_cbundleCurIndex].offset = startPos;
-
- Common::File cmpFile(tmpPath, "rb");
- cmpFile.seek(0, SEEK_END);
- size = cmpFile.pos();
- cmpFile.seek(0, SEEK_SET);
- byte *tmpBuf = (byte *)malloc(size);
- cmpFile.read_throwsOnError(tmpBuf, size);
- cmpFile.close();
- Common::removeFile(tmpPath);
-
- output.write(tmpBuf, size);
- free(tmpBuf);
- _cbundleTable[_cbundleCurIndex].size = output.pos() - startPos;
- _cbundleCurIndex++;
- }
- free(_region);
-}
-
-void CompressScummBun::recalcRegions(int32 &value, int bits, int freq, int channels) {
- int size = value;
- if (bits == 8)
- size *= 2;
- if (bits == 12)
- size = (size / 3) * 4;
- value = size;
-}
-
-void CompressScummBun::writeToRMAPFile(byte *ptr, Common::File &output, char *filename, int &offsetData, int &bits, int &freq, int &channels) {
- byte *s_ptr = ptr;
- int32 size = 0;
- int l;
-
- uint32 tag = READ_BE_UINT32(ptr);
- assert(tag == 'iMUS');
- ptr += 16;
-
- int curIndexRegion = 0;
- int curIndexJump = 0;
- int curIndexSync = 0;
- int curIndexMarker = 0;
-
- int numRegions = 0, numJumps = 0, numSyncs = 0, numMarkers = 0;
- countMapElements(ptr, numRegions, numJumps, numSyncs, numMarkers);
- Region *region = (Region *)malloc(sizeof(Region) * numRegions);
- _region = (Region *)malloc(sizeof(Region) * numRegions);
- _numRegions = numRegions;
- Jump *jump = (Jump *)malloc(sizeof(Jump) * numJumps);
- Sync *sync = (Sync *)malloc(sizeof(Sync) * numSyncs);
- Marker *marker = (Marker *)malloc(sizeof(Marker) * numMarkers);
-
- do {
- tag = READ_BE_UINT32(ptr); ptr += 4;
- switch (tag) {
- case 'FRMT':
- ptr += 12;
- bits = READ_BE_UINT32(ptr); ptr += 4;
- freq = READ_BE_UINT32(ptr); ptr += 4;
- channels = READ_BE_UINT32(ptr); ptr += 4;
- break;
- case 'TEXT':
- if (!scumm_stricmp((const char *)(ptr + 8), "exit")) {
- marker[curIndexMarker].pos = READ_BE_UINT32(ptr + 4);
- marker[curIndexMarker].length = strlen((const char *)(ptr + 8)) + 1;
- marker[curIndexMarker].ptr = new char[marker[curIndexMarker].length];
- strcpy(marker[curIndexMarker].ptr, (const char *)(ptr + 8));
- curIndexMarker++;
- }
- size = READ_BE_UINT32(ptr); ptr += size + 4;
- break;
- case 'STOP':
- size = READ_BE_UINT32(ptr); ptr += size + 4;
- break;
- case 'REGN':
- ptr += 4;
- region[curIndexRegion].offset = READ_BE_UINT32(ptr); ptr += 4;
- region[curIndexRegion].length = READ_BE_UINT32(ptr); ptr += 4;
- curIndexRegion++;
- break;
- case 'JUMP':
- ptr += 4;
- jump[curIndexJump].offset = READ_BE_UINT32(ptr); ptr += 4;
- jump[curIndexJump].dest = READ_BE_UINT32(ptr); ptr += 4;
- jump[curIndexJump].hookId = READ_BE_UINT32(ptr); ptr += 4;
- jump[curIndexJump].fadeDelay = READ_BE_UINT32(ptr); ptr += 4;
- curIndexJump++;
- break;
- case 'SYNC':
- size = READ_BE_UINT32(ptr); ptr += 4;
- sync[curIndexSync].size = size;
- sync[curIndexSync].ptr = (byte *)malloc(size);
- memcpy(sync[curIndexSync].ptr, ptr, size);
- curIndexSync++;
- ptr += size;
- break;
- case 'DATA':
- ptr += 4;
- break;
- default:
- error("writeToRMAPFile() Unknown tag of Map for sound '%s'", filename);
- }
- } while (tag != 'DATA');
- offsetData = (int32)(ptr - s_ptr);
-
- int32 startPos = output.pos();
- sprintf(_cbundleTable[_cbundleCurIndex].filename, "%s.map", filename);
- _cbundleTable[_cbundleCurIndex].offset = startPos;
-
- output.writeUint32BE('RMAP');
- output.writeUint32BE(3); // version
- output.writeUint32BE(16); // bits
- output.writeUint32BE(freq);
- output.writeUint32BE(channels);
- output.writeUint32BE(numRegions);
- output.writeUint32BE(numJumps);
- output.writeUint32BE(numSyncs);
- output.writeUint32BE(numMarkers);
- memcpy(_region, region, sizeof(Region) * numRegions);
- for (l = 0; l < numRegions; l++) {
- _region[l].offset -= offsetData;
- region[l].offset -= offsetData;
- recalcRegions(region[l].offset, bits, freq, channels);
- recalcRegions(region[l].length, bits, freq, channels);
- output.writeUint32BE(region[l].offset);
- output.writeUint32BE(region[l].length);
- }
- for (l = 0; l < numJumps; l++) {
- jump[l].offset -= offsetData;
- jump[l].dest -= offsetData;
- recalcRegions(jump[l].offset, bits, freq, channels);
- recalcRegions(jump[l].dest, bits, freq, channels);
- output.writeUint32BE(jump[l].offset);
- output.writeUint32BE(jump[l].dest);
- output.writeUint32BE(jump[l].hookId);
- output.writeUint32BE(jump[l].fadeDelay);
- }
- for (l = 0; l < numSyncs; l++) {
- output.writeUint32BE(sync[l].size);
- output.write(sync[l].ptr, sync[l].size);
- free(sync[l].ptr);
- }
- for (l = 0; l < numMarkers; l++) {
- output.writeUint32BE(marker[l].pos);
- output.writeUint32BE(marker[l].length);
- output.write(marker[l].ptr, marker[l].length);
- delete[] marker[l].ptr;
- }
- free(region);
- free(jump);
- free(sync);
- free(marker);
-
- _cbundleTable[_cbundleCurIndex].size = output.pos() - startPos;
- _cbundleCurIndex++;
-}
-
-CompressScummBun::CompressScummBun(const std::string &name) : CompressionTool(name, TOOLTYPE_COMPRESSION) {
- _cbundleCurIndex = 0;
-
- _supportsProgressBar = true;
- _supportsMultipleRuns = true;
-
- ToolInput input;
- input.format = "*.bun";
- _inputPaths.push_back(input);
-
- _shorthelp = "Used to compress .bun data files from The Curse of Monkey Island.";
- _helptext = "\nUsage: " + getName() + " [mode] [mode-params] [-o outputfile = inputfile.bun] <inputfile>\n";
-}
-
-void CompressScummBun::execute() {
- Common::Filename inpath(_inputPaths[0].path);
- Common::Filename &outpath = _outputPath;
-
- uint32 tag;
- int32 numFiles, offset;
-
- Common::File input(inpath, "rb");
-
- if (outpath.empty()) {
- // Change extension for output
- outpath = inpath;
- }
-
- outpath.setFullName(inpath.getName());
- outpath.setExtension(".bun");
- Common::File output(outpath, "wb");
-
- output.writeUint32BE('LB23');
- output.writeUint32BE(0); // will be later
- output.writeUint32BE(0); // will be later
-
- initializeImcTables();
-
- tag = input.readUint32BE();
- assert(tag == 'LB83');
- offset = input.readUint32BE();
- numFiles = input.readUint32BE();
-
- _bundleTable = (BundleAudioTable *)malloc(numFiles * sizeof(BundleAudioTable));
- input.seek(offset, SEEK_SET);
-
- for (int i = 0; i < numFiles; i++) {
- char filename[13], c;
- int z = 0;
- int z2;
-
- for (z2 = 0; z2 < 8; z2++)
- if ((c = input.readByte()) != 0)
- filename[z++] = c;
- filename[z++] = '.';
- for (z2 = 0; z2 < 4; z2++)
- if ((c = input.readByte()) != 0)
- filename[z++] = c;
- filename[z] = '\0';
- strcpy(_bundleTable[i].filename, filename);
- _bundleTable[i].offset = input.readUint32BE();
- _bundleTable[i].size = input.readUint32BE();
- }
-
- for (int i = 0; i < numFiles; i++) {
- if (strcmp(_bundleTable[i].filename, "PRELOAD.") == 0)
- continue;
-
- updateProgress(i, numFiles);
-
- int offsetData = 0, bits = 0, freq = 0, channels = 0;
- int32 size = 0;
- bool rawMuse = false;
- byte *compFinal = decompressBundleSound(i, input, size, rawMuse);
- if (!compFinal) {
- printf("%s is garbage. Skipping\n", _bundleTable[i].filename);
- continue;
- }
- writeToRMAPFile(compFinal, output, _bundleTable[i].filename, offsetData, bits, freq, channels);
- writeRegions(compFinal + offsetData, bits, freq, channels, outpath.getPath().c_str(), _bundleTable[i].filename, output, rawMuse && bits == 16);
- free(compFinal);
- }
-
- int32 curPos = output.pos();
- for (int i = 0; i < _cbundleCurIndex; i++) {
- output.write(_cbundleTable[i].filename, 24);
- output.writeUint32BE(_cbundleTable[i].offset);
- output.writeUint32BE(_cbundleTable[i].size);
- }
-
- output.seek(4, SEEK_SET);
- output.writeUint32BE(curPos);
- output.writeUint32BE(_cbundleCurIndex);
-
- free(_bundleTable);
-
- print("compression done.");
-}
-
-#ifdef STANDALONE_MAIN
-int main(int argc, char *argv[]) {
- CompressScummBun scummbun(argv[0]);
- return scummbun.run(argc, argv);
-}
-#endif
diff --git a/engines/scumm/compress_scumm_bun.h b/engines/scumm/compress_scumm_bun.h
deleted file mode 100644
index fcd58bf..0000000
--- a/engines/scumm/compress_scumm_bun.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* ScummVM Tools
- *
- * ScummVM Tools is the legal property of its developers, whose
- * names are too numerous to list here. Please refer to the
- * COPYRIGHT file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-/* compressor for bundle files */
-
-#ifndef COMPRESS_SCUMM_BUN_H
-#define COMPRESS_SCUMM_BUN_H
-
-#include "compress.h"
-
-class CompressScummBun : public CompressionTool {
-public:
- CompressScummBun(const std::string &name = "compress_scumm_bun");
-
- virtual void execute();
-
- struct BundleAudioTable {
- char filename[24];
- int size;
- int offset;
- };
-
-protected:
-
- Common::File _waveTmpFile;
- int32 _waveDataSize;
- BundleAudioTable *_bundleTable;
- BundleAudioTable _cbundleTable[10000]; // difficult to calculate
- int32 _cbundleCurIndex;
-
- int32 compDecode(byte *src, byte *dst);
- int32 decompressCodec(int32 codec, byte *comp_input, byte *comp_output, int32 input_size);
- void encodeWaveWithFlac(char *filename);
- void encodeWaveWithOgg(char *filename);
- void encodeWaveWithLame(char *filename);
- void writeWaveHeader(int s_size, int rate, int chan);
- void writeToTempWave(char *fileName, byte *output_data, unsigned int size, bool littleEndian);
- byte *decompressBundleSound(int index, Common::File &input, int32 &finalSize, bool &rawBundle);
- byte *convertTo16bit(byte *ptr, int inputSize, int &outputSize, int bits, int freq, int channels);
- void countMapElements(byte *ptr, int &numRegions, int &numJumps, int &numSyncs, int &numMarkers);
- void writeRegions(byte *ptr, int bits, int freq, int channels, const char *dir, char *filename, Common::File &output,
- bool littleEndian);
- void recalcRegions(int32 &value, int bits, int freq, int channels);
- void writeToRMAPFile(byte *ptr, Common::File &output, char *filename, int &offsetData, int &bits, int &freq, int &channels);
-};
-
-#endif
diff --git a/tools.cpp b/tools.cpp
index 54debe9..156b41a 100644
--- a/tools.cpp
+++ b/tools.cpp
@@ -30,7 +30,6 @@
#include "engines/kyra/compress_kyra.h"
#include "engines/queen/compress_queen.h"
#include "engines/saga/compress_saga.h"
-#include "engines/scumm/compress_scumm_bun.h"
#include "engines/scumm/compress_scumm_san.h"
#include "engines/scumm/compress_scumm_sou.h"
#include "engines/sci/compress_sci.h"
@@ -76,7 +75,6 @@ Tools::Tools() {
_tools.push_back(new CompressQueen());
_tools.push_back(new CompressSaga());
_tools.push_back(new CompressSci());
- _tools.push_back(new CompressScummBun());
_tools.push_back(new CompressScummSan());
_tools.push_back(new CompressScummSou());
_tools.push_back(new CompressSword1());
More information about the Scummvm-git-logs
mailing list