Skip to content
Snippets Groups Projects
Commit fee6bbff authored by Mathis Rosenhauer's avatar Mathis Rosenhauer Committed by Thomas Jahns
Browse files

Create SE decoding table on the fly

parent b31c3e6c
No related branches found
No related tags found
No related merge requests found
......@@ -15,226 +15,6 @@
#include "libaec.h"
#include "decode.h"
static int se_beta(int m)
{
switch(m) {
case 0:
return 0;
case 1:
case 2:
return 1;
case 3:
case 4:
case 5:
return 2;
case 6:
case 7:
case 8:
case 9:
return 3;
case 10:
case 11:
case 12:
case 13:
case 14:
return 4;
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
return 5;
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
return 6;
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
return 7;
case 36:
case 37:
case 38:
case 39:
case 40:
case 41:
case 42:
case 43:
case 44:
return 8;
case 45:
case 46:
case 47:
case 48:
case 49:
case 50:
case 51:
case 52:
case 53:
case 55:
return 9;
case 56:
case 57:
case 58:
case 59:
case 60:
case 61:
case 62:
case 63:
case 64:
case 65:
case 66:
return 10;
case 67:
case 68:
case 69:
case 70:
case 71:
case 72:
case 73:
case 74:
case 75:
case 76:
case 77:
case 78:
return 11;
case 79:
case 80:
case 81:
case 82:
case 83:
case 84:
case 85:
case 86:
case 87:
case 88:
case 89:
case 90:
case 91:
return 12;
}
}
static int se_ms(int m)
{
switch(m) {
case 0:
return 0;
case 1:
case 2:
return 1;
case 3:
case 4:
case 5:
return 3;
case 6:
case 7:
case 8:
case 9:
return 6;
case 10:
case 11:
case 12:
case 13:
case 14:
return 10;
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
return 15;
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
return 21;
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
return 28;
case 36:
case 37:
case 38:
case 39:
case 40:
case 41:
case 42:
case 43:
case 44:
return 36;
case 45:
case 46:
case 47:
case 48:
case 49:
case 50:
case 51:
case 52:
case 53:
case 55:
return 45;
case 56:
case 57:
case 58:
case 59:
case 60:
case 61:
case 62:
case 63:
case 64:
case 65:
case 66:
return 56;
case 67:
case 68:
case 69:
case 70:
case 71:
case 72:
case 73:
case 74:
case 75:
case 76:
case 77:
case 78:
return 67;
case 79:
case 80:
case 81:
case 82:
case 83:
case 84:
case 85:
case 86:
case 87:
case 88:
case 89:
case 90:
case 91:
return 79;
}
}
static void put_msb_32(struct aec_stream *strm, int64_t data)
{
*strm->next_out++ = data >> 24;
......@@ -372,9 +152,8 @@ static inline int64_t u_get_fs(struct aec_stream *strm)
static inline void fast_split(struct aec_stream *strm)
{
int i, k;
struct internal_state *state;
struct internal_state *state= strm->state;
state = strm->state;
k = state->id - 1;
if (state->ref)
......@@ -401,15 +180,16 @@ static inline void fast_se(struct aec_stream *strm)
{
int i;
int64_t m, d1;
struct internal_state *state= strm->state;
i = strm->state->ref;
i = state->ref;
while (i < strm->block_size) {
m = u_get_fs(strm);
d1 = m - se_ms(m);
d1 = m - state->se_table[2 * m + 1];
if ((i & 1) == 0) {
u_put(strm, se_beta(m) - d1);
u_put(strm, state->se_table[2 * m] - d1);
i++;
}
u_put(strm, d1);
......@@ -606,10 +386,10 @@ static int m_se_decode(struct aec_stream *strm)
while(state->i < strm->block_size) {
ASKFS(strm);
m = GETFS(strm);
d1 = m - se_ms(m);
d1 = m - state->se_table[2 * m + 1];
if ((state->i & 1) == 0) {
PUT(strm, se_beta(m) - d1);
PUT(strm, state->se_table[2 * m] - d1);
state->i++;
}
......@@ -691,6 +471,21 @@ static int m_uncomp(struct aec_stream *strm)
return M_CONTINUE;
}
static void create_se_table(int *table)
{
int i, j, k, ms;
k = 0;
for (i = 0; i < 13; i++) {
ms = k;
for (j = 0; j <= i; j++) {
table[2 * k] = i;
table[2 * k + 1] = ms;
k++;
}
}
}
int aec_decode_init(struct aec_stream *strm)
{
int i, modi;
......@@ -703,6 +498,12 @@ int aec_decode_init(struct aec_stream *strm)
if (state == NULL)
return AEC_MEM_ERROR;
state->se_table = (int *) malloc(180 * sizeof(int));
if (state->se_table == NULL)
return AEC_MEM_ERROR;
create_se_table(state->se_table);
strm->state = state;
if (strm->bit_per_sample > 16) {
......@@ -794,9 +595,8 @@ int aec_decode(struct aec_stream *strm, int flush)
int aec_decode_end(struct aec_stream *strm)
{
struct internal_state *state;
struct internal_state *state= strm->state;
state = strm->state;
free(state->block);
free(state->id_table);
free(state);
......
......@@ -41,6 +41,7 @@ struct internal_state {
int pp; /* 1 if postprocessor has to be used */
int byte_per_sample;
size_t samples_out;
int *se_table;
} decode_state;
#endif /* DECODE_H */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment