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 {