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;