Mercurial > libavcodec.hg
comparison flacenc.c @ 5732:d6fc148d1a48 libavcodec
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.
author | lorenm |
---|---|
date | Sat, 29 Sep 2007 05:41:27 +0000 |
parents | 976b4c5e68bb |
children | c2f88af57c16 |
comparison
equal
deleted
inserted
replaced
5731:976b4c5e68bb | 5732:d6fc148d1a48 |
---|---|
445 } | 445 } |
446 | 446 |
447 | 447 |
448 #define rice_encode_count(sum, n, k) (((n)*((k)+1))+((sum-(n>>1))>>(k))) | 448 #define rice_encode_count(sum, n, k) (((n)*((k)+1))+((sum-(n>>1))>>(k))) |
449 | 449 |
450 /** | |
451 * Solve for d/dk(rice_encode_count) = n-((sum-(n>>1))>>(k+1)) = 0 | |
452 */ | |
450 static int find_optimal_param(uint32_t sum, int n) | 453 static int find_optimal_param(uint32_t sum, int n) |
451 { | 454 { |
452 int k, k_opt; | 455 int k; |
453 uint32_t nbits[MAX_RICE_PARAM+1]; | 456 uint32_t sum2; |
454 | 457 |
455 k_opt = 0; | 458 if(sum <= n>>1) |
456 nbits[0] = UINT32_MAX; | 459 return 0; |
457 for(k=0; k<=MAX_RICE_PARAM; k++) { | 460 sum2 = sum-(n>>1); |
458 nbits[k] = rice_encode_count(sum, n, k); | 461 k = av_log2(n<256 ? FASTDIV(sum2,n) : sum2/n); |
459 if(nbits[k] < nbits[k_opt]) { | 462 return FFMIN(k, MAX_RICE_PARAM); |
460 k_opt = k; | |
461 } | |
462 } | |
463 return k_opt; | |
464 } | 463 } |
465 | 464 |
466 static uint32_t calc_optimal_rice_params(RiceContext *rc, int porder, | 465 static uint32_t calc_optimal_rice_params(RiceContext *rc, int porder, |
467 uint32_t *sums, int n, int pred_order) | 466 uint32_t *sums, int n, int pred_order) |
468 { | 467 { |