Mercurial > libavcodec.hg
changeset 3478:5a71102c2770 libavcodec
log prediction order search method
author | michael |
---|---|
date | Sun, 16 Jul 2006 15:46:45 +0000 |
parents | 30ac8a424448 |
children | d57df84a8462 |
files | flacenc.c |
diffstat | 1 files changed, 24 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/flacenc.c Sun Jul 16 13:34:47 2006 +0000 +++ b/flacenc.c Sun Jul 16 15:46:45 2006 +0000 @@ -43,6 +43,7 @@ #define ORDER_METHOD_4LEVEL 2 #define ORDER_METHOD_8LEVEL 3 #define ORDER_METHOD_SEARCH 4 +#define ORDER_METHOD_LOG 5 #define FLAC_STREAMINFO_SIZE 34 @@ -291,7 +292,7 @@ s->options.min_prediction_order, s->options.max_prediction_order); if(avctx->prediction_order_method >= 0) { - if(avctx->prediction_order_method > ORDER_METHOD_SEARCH) { + if(avctx->prediction_order_method > ORDER_METHOD_LOG) { av_log(avctx, AV_LOG_ERROR, "invalid prediction order method: %d\n", avctx->prediction_order_method); return -1; @@ -309,6 +310,8 @@ "8-level"); break; case ORDER_METHOD_SEARCH: av_log(avctx, AV_LOG_DEBUG, " order method: %s\n", "full search"); break; + case ORDER_METHOD_LOG: av_log(avctx, AV_LOG_DEBUG, " order method: %s\n", + "log search"); break; } if(avctx->min_partition_order >= 0) { @@ -951,6 +954,26 @@ } } opt_order++; + } else if(omethod == ORDER_METHOD_LOG) { + uint32_t bits[MAX_LPC_ORDER]; + int step; + + opt_order= min_order - 1 + (max_order-min_order)/3; + memset(bits, -1, sizeof(bits)); + + for(step=16 ;step; step>>=1){ + int last= opt_order; + for(i=last-step; i<=last+step; i+= step){ + if(i<min_order-1 || i>=max_order || bits[i] < UINT32_MAX) + continue; + encode_residual_lpc(res, smp, n, i+1, coefs[i], shift[i]); + bits[i] = calc_rice_params_lpc(&sub->rc, min_porder, max_porder, + res, n, i+1, sub->obits, precision); + if(bits[i] < bits[opt_order]) + opt_order= i; + } + } + opt_order++; } sub->order = opt_order;