Moderators: simonsunnyboy, Mug UK, Zorro 2, Moderator Team





Zamuel_a wrote:Is it possible with some audio decompression in realtime for audio samples? Had been nice to have that in a game, but it has to be rather fast then and compress the sample to some amount. If its only to 80-90% its not worth it.
Is there else some way to rather fast decompress a audiosample, not in realtime, so it just saves space on the disc, but can be decompressed rather fast anyway.


earx wrote:MrNi: LZ coding is as good as useless on more-or-less noisy data. Huffman or another entropy coder do help. I tried a pure Huffman codec and zip and the differences were (logically) negligible.


bod/STAX wrote:It's possible.
I think Gunstick/ULM did it in his parallax distorter screen in the Dark Side of the Spoon demo using delta-compression.


BYTE delta_conversion_table[256];
char delta_table[16] = {0,1,2,4,8,16,32,64,127,-64,-32,-16,-8,-4,-2,-1};
void createDeltaTable()
{
int i,j=-128;
for (i=0; i<255; i++,j++)
{
if (j==0) delta_conversion_table[i] = 0;
if (j==1) delta_conversion_table[i] = 1;
if (j>=2 && j<=3) delta_conversion_table[i] = 2;
if (j>=4 && j<=6) delta_conversion_table[i] = 3;
if (j>=7 && j<=12) delta_conversion_table[i] = 4;
if (j>=13 && j<=24) delta_conversion_table[i] = 5;
if (j>=25 && j<=48) delta_conversion_table[i] = 6;
if (j>=49 && j<=96) delta_conversion_table[i] = 7;
if (j>=97 && j<=127) delta_conversion_table[i] = 8;
if (j>=-128 && j<=-97) delta_conversion_table[i] = 8;
if (j>=-96 && j<=-49) delta_conversion_table[i] = 9;
if (j>=-48 && j<=-25) delta_conversion_table[i] = 10;
if (j>=-24 && j<=-13) delta_conversion_table[i] = 11;
if (j>=-12 && j<=-7) delta_conversion_table[i] = 12;
if (j>=-6 && j<=-4) delta_conversion_table[i] = 13;
if (j>=-3 && j<=-2) delta_conversion_table[i] = 14;
if (j==-1) delta_conversion_table[i] = 15;
}
}
void calcDelta()
{
int i;
BYTE previous = 0;
BYTE delta;
BYTE c;
for (i=0; i<buffer_length; i++)
{
c = buffer[i];
delta =c - previous;
delta_buffer[i] = delta_conversion_table[(BYTE)(delta+128)];
previous = c;
}
}
void decompress()
{
int i;
BYTE index;
char value;
char old_value=0;
BYTE sample;
for (i=0; i<buffer_length; i++)
{
index = delta_buffer[i];
value = delta_table[index];
sample = old_value+value;
old_value = sample;
buffer[i] = sample;
}
}

Zamuel_a wrote:So it looks ok at first, but then halfway in it gets all wrong.
void calcDelta()
{
int i;
BYTE previous = 0;
BYTE delta;
BYTE c;
for (i=0; i<buffer_length; i++)
{
c = buffer[i];
delta =c - previous;
delta_buffer[i] = delta_conversion_table[(BYTE)(delta+128)];
previous += delta_buffer[i];
}
}



Users browsing this forum: CommonCrawl [Bot] and 0 guests