mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-29 22:00:58 +02:00
replace brute force find_optimal_param() with a closed-form solution.
overall flac encoding: 4-15% faster. output is not identical to the previous algorithm due to occasional rounding errors, but the differece is less than .0005% bitrate. Originally committed as revision 10612 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
f6215b1b06
commit
14bd2a9f25
@ -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];
|
||||
int k;
|
||||
uint32_t sum2;
|
||||
|
||||
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;
|
||||
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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user