|
|
@ -515,7 +515,7 @@ static int encode_exp(uint8_t encoded_exp[N/2], |
|
|
|
int nb_exps, |
|
|
|
int nb_exps, |
|
|
|
int exp_strategy) |
|
|
|
int exp_strategy) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int group_size, nb_groups, i, j, k, recurse, exp_min, delta; |
|
|
|
int group_size, nb_groups, i, j, k, exp_min; |
|
|
|
uint8_t exp1[N/2]; |
|
|
|
uint8_t exp1[N/2]; |
|
|
|
|
|
|
|
|
|
|
|
switch(exp_strategy) { |
|
|
|
switch(exp_strategy) { |
|
|
@ -550,25 +550,13 @@ static int encode_exp(uint8_t encoded_exp[N/2], |
|
|
|
if (exp1[0] > 15) |
|
|
|
if (exp1[0] > 15) |
|
|
|
exp1[0] = 15; |
|
|
|
exp1[0] = 15; |
|
|
|
|
|
|
|
|
|
|
|
/* Iterate until the delta constraints between each groups are
|
|
|
|
/* Decrease the delta between each groups to within 2
|
|
|
|
satisfyed. I'm sure it is possible to find a better algorithm, |
|
|
|
* so that they can be differentially encoded */ |
|
|
|
but I am lazy */ |
|
|
|
for (i=1;i<=nb_groups;i++) |
|
|
|
do { |
|
|
|
exp1[i] = FFMIN(exp1[i], exp1[i-1] + 2); |
|
|
|
recurse = 0; |
|
|
|
for (i=nb_groups-1;i>=0;i--) |
|
|
|
for(i=1;i<=nb_groups;i++) { |
|
|
|
exp1[i] = FFMIN(exp1[i], exp1[i+1] + 2); |
|
|
|
delta = exp1[i] - exp1[i-1]; |
|
|
|
|
|
|
|
if (delta > 2) { |
|
|
|
|
|
|
|
/* if delta too big, we encode a smaller exponent */ |
|
|
|
|
|
|
|
exp1[i] = exp1[i-1] + 2; |
|
|
|
|
|
|
|
} else if (delta < -2) { |
|
|
|
|
|
|
|
/* if delta is too small, we must decrease the previous
|
|
|
|
|
|
|
|
exponent, which means we must recurse */ |
|
|
|
|
|
|
|
recurse = 1; |
|
|
|
|
|
|
|
exp1[i-1] = exp1[i] + 2; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} while (recurse); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* now we have the exponent values the decoder will see */ |
|
|
|
/* now we have the exponent values the decoder will see */ |
|
|
|
encoded_exp[0] = exp1[0]; |
|
|
|
encoded_exp[0] = exp1[0]; |
|
|
|
k = 1; |
|
|
|
k = 1; |
|
|
|