Commit 422bd247 authored by Mathis Rosenhauer's avatar Mathis Rosenhauer Committed by Thomas Jahns

Remove skipping as it doesn't help much if any

parent 860ce5b5
......@@ -358,33 +358,20 @@ static int count_splitting_option(struct aec_stream *strm)
CDS length, we start with the k of the previous CDS. K is
increased and the CDS length evaluated. If the CDS length gets
smaller, then we are moving towards the minimum. If the length
increases, then the minimum will be found with smaller k. Two
additional checks are used to speed up the process:
1. If we are increasing k to find the minimum then we know that
k+1 will at most eliminate the FS part. OTOH we gain block_size
bits in length through the increased binary part. So if the FS
lenth is already less than the block size then the length of
the CDS for k+1 will be larger than for k. The same can be done
for decreasing k.
2. If 1. is not the case then we have to continue looking. The
next step would be to increase k by one and evaluate the CDS
length. A lower limit for the k+1 FS length is
0.5*(FS_len-block_size). If half of that is more than
block_size then we can skip k+1 altogether. This reduces to the
condition:
if (fs_len > 5 * block_size)
k++;
We can be repeat this step while the condition is met to skip
several k.
increases, then the minimum will be found with smaller k.
For increasing k we know that we will gain block_size bits in
length through the larger binary part. If the FS lenth is less
than the block size then a reduced FS part can't compensate the
larger binary part. So we know that the CDS for k+1 will be
larger than for k without actually computing the length. An
analogue check can be done for decreasing k.
*/
int k, k_min;
int this_bs; /* Block size of current block */
int min_dir; /* 1 if we saw a decrease in CDS length */
int no_turn; /* 1 if we shouldn't reverse */
int dir; /* Direction, 1 means increasing k, 0 decreasing k */
uint64_t len; /* CDS length for current k */
uint64_t len_min; /* CDS length minimum so far */
......@@ -395,8 +382,8 @@ static int count_splitting_option(struct aec_stream *strm)
this_bs = strm->block_size - state->ref;
len_min = UINT64_MAX;
k = k_min = state->k;
no_turn = (k == 0) ? 1 : 0;
dir = 1;
min_dir = 0;
for (;;) {
fs_len = block_fs(strm, k);
......@@ -404,43 +391,32 @@ static int count_splitting_option(struct aec_stream *strm)
if (len < len_min) {
if (len_min < UINT64_MAX)
min_dir = 1;
no_turn = 1;
len_min = len;
k_min = k;
if (dir) {
if (fs_len < this_bs) {
goto reverse;
} else {
while (fs_len > 5 * this_bs) {
k++;
fs_len /= 5;
}
if (fs_len < this_bs || k >= state->kmax) {
if (no_turn)
break;
k = state->k - 1;
dir = 0;
no_turn = 1;
}
if (k >= state->kmax)
goto reverse;
else
k++;
k++;
} else {
if (fs_len >= this_bs || k == 0)
break;
k--;
}
} else {
goto reverse;
if (no_turn)
break;
k = state->k - 1;
dir = 0;
no_turn = 1;
}
continue;
reverse:
if (min_dir || state->k == 0)
break;
k = state->k - 1;
dir = 0;
min_dir = 1;
}
state->k = k_min;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment