From e44cad52914532d5e87f528b823f0f0ead21b1e0 Mon Sep 17 00:00:00 2001
From: Jeff Muizelaar <jrmuizel@gmail.com>
Date: Mon, 2 Aug 2004 10:42:21 +0000
Subject: [PATCH] simpler delta decreasing algorithm patch by (Jeff Muizelaar
 <jrmuizel at student dot cs dot uwaterloo dot ca>)

Originally committed as revision 3369 to svn://svn.ffmpeg.org/ffmpeg/trunk
---
 libavcodec/ac3enc.c | 28 ++++++++--------------------
 1 file changed, 8 insertions(+), 20 deletions(-)

diff --git a/libavcodec/ac3enc.c b/libavcodec/ac3enc.c
index 1ce534a8ed3..78af63b9c96 100644
--- a/libavcodec/ac3enc.c
+++ b/libavcodec/ac3enc.c
@@ -515,7 +515,7 @@ static int encode_exp(uint8_t encoded_exp[N/2],
                       int nb_exps,
                       int exp_strategy)
 {
-    int group_size, nb_groups, i, j, k, recurse, exp_min, delta;
+    int group_size, nb_groups, i, j, k, exp_min;
     uint8_t exp1[N/2];
 
     switch(exp_strategy) {
@@ -550,25 +550,13 @@ static int encode_exp(uint8_t encoded_exp[N/2],
     if (exp1[0] > 15)
         exp1[0] = 15;
 
-    /* Iterate until the delta constraints between each groups are
-       satisfyed. I'm sure it is possible to find a better algorithm,
-       but I am lazy */
-    do {
-        recurse = 0;
-        for(i=1;i<=nb_groups;i++) {
-            delta = exp1[i] - exp1[i-1];
-            if (delta > 2) {
-                /* if delta too big, we encode a smaller exponent */
-                exp1[i] = exp1[i-1] + 2;
-            } else if (delta < -2) {
-                /* if delta is too small, we must decrease the previous
-               exponent, which means we must recurse */
-                recurse = 1;
-                exp1[i-1] = exp1[i] + 2;
-            }
-        }
-    } while (recurse);
-    
+    /* Decrease the delta between each groups to within 2
+     * so that they can be differentially encoded */
+    for (i=1;i<=nb_groups;i++)
+	exp1[i] = FFMIN(exp1[i], exp1[i-1] + 2);
+    for (i=nb_groups-1;i>=0;i--)
+	exp1[i] = FFMIN(exp1[i], exp1[i+1] + 2);
+
     /* now we have the exponent values the decoder will see */
     encoded_exp[0] = exp1[0];
     k = 1;
-- 
GitLab