Commit a2c34e40 authored by lorenm's avatar lorenm

replace brute force find_optimal_param() with a closed-form solution.

overall flac encoding: 4-15% faster


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@10612 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 52b3e338
......@@ -447,20 +447,19 @@ static void copy_samples(FlacEncodeContext *s, int16_t *samples)
#define rice_encode_count(sum, n, k) (((n)*((k)+1))+((sum-(n>>1))>>(k)))
/**
* Solve for d/dk(rice_encode_count) = n-((sum-(n>>1))>>(k+1)) = 0
*/
static int find_optimal_param(uint32_t sum, int n)
{
int k, k_opt;
uint32_t nbits[MAX_RICE_PARAM+1];
k_opt = 0;
nbits[0] = UINT32_MAX;
for(k=0; k<=MAX_RICE_PARAM; k++) {
nbits[k] = rice_encode_count(sum, n, k);
if(nbits[k] < nbits[k_opt]) {
k_opt = k;
}
}
return k_opt;
int k;
uint32_t sum2;
if(sum <= n>>1)
return 0;
sum2 = sum-(n>>1);
k = av_log2(n<256 ? FASTDIV(sum2,n) : sum2/n);
return FFMIN(k, MAX_RICE_PARAM);
}
static uint32_t calc_optimal_rice_params(RiceContext *rc, int porder,
......
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