annotate liba52/bit_allocate.c @ 23572:a00685941686

demux_mkv very long seek fix The seek code searching for the closest position in the index used "int64_t min_diff=0xFFFFFFFL" as the initial "further from the goal than any real alternative" value. The unit is milliseconds so seeks more than about 75 hours past the end of the file would fail to recognize the last index position as the best match. This was triggered in practice by chapter seek code which apparently uses a seek of 1000000000 seconds forward to mean "seek to the end". The practical effect was that trying to seek to the next chapter in a file without chapters made MPlayer block until it finished reading the file from the current position to the end. Fixed by increasing the initial value from FFFFFFF to FFFFFFFFFFFFFFF.
author uau
date Wed, 20 Jun 2007 18:19:03 +0000
parents 722ac20fac5f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
1 /*
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
2 * bit_allocate.c
18720
4bad7f00556e sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents: 3394
diff changeset
3 * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org>
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
4 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
5 *
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
6 * This file is part of a52dec, a free ATSC A-52 stream decoder.
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
7 * See http://liba52.sourceforge.net/ for updates.
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
8 *
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
9 * a52dec is free software; you can redistribute it and/or modify
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
10 * it under the terms of the GNU General Public License as published by
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
11 * the Free Software Foundation; either version 2 of the License, or
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
12 * (at your option) any later version.
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
13 *
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
14 * a52dec is distributed in the hope that it will be useful,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
17 * GNU General Public License for more details.
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
18 *
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
20 * along with this program; if not, write to the Free Software
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
22 */
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
23
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
24 #include "config.h"
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
25
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
26 #include <inttypes.h>
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
27
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
28 #include "a52.h"
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
29 #include "a52_internal.h"
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
30
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
31 static int hthtab[3][50] = {
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
32 {0x730, 0x730, 0x7c0, 0x800, 0x820, 0x840, 0x850, 0x850, 0x860, 0x860,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
33 0x860, 0x860, 0x860, 0x870, 0x870, 0x870, 0x880, 0x880, 0x890, 0x890,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
34 0x8a0, 0x8a0, 0x8b0, 0x8b0, 0x8c0, 0x8c0, 0x8d0, 0x8e0, 0x8f0, 0x900,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
35 0x910, 0x910, 0x910, 0x910, 0x900, 0x8f0, 0x8c0, 0x870, 0x820, 0x7e0,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
36 0x7a0, 0x770, 0x760, 0x7a0, 0x7c0, 0x7c0, 0x6e0, 0x400, 0x3c0, 0x3c0},
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
37 {0x710, 0x710, 0x7a0, 0x7f0, 0x820, 0x830, 0x840, 0x850, 0x850, 0x860,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
38 0x860, 0x860, 0x860, 0x860, 0x870, 0x870, 0x870, 0x880, 0x880, 0x880,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
39 0x890, 0x890, 0x8a0, 0x8a0, 0x8b0, 0x8b0, 0x8c0, 0x8c0, 0x8e0, 0x8f0,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
40 0x900, 0x910, 0x910, 0x910, 0x910, 0x900, 0x8e0, 0x8b0, 0x870, 0x820,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
41 0x7e0, 0x7b0, 0x760, 0x770, 0x7a0, 0x7c0, 0x780, 0x5d0, 0x3c0, 0x3c0},
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
42 {0x680, 0x680, 0x750, 0x7b0, 0x7e0, 0x810, 0x820, 0x830, 0x840, 0x850,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
43 0x850, 0x850, 0x860, 0x860, 0x860, 0x860, 0x860, 0x860, 0x860, 0x860,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
44 0x870, 0x870, 0x870, 0x870, 0x880, 0x880, 0x880, 0x890, 0x8a0, 0x8b0,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
45 0x8c0, 0x8d0, 0x8e0, 0x8f0, 0x900, 0x910, 0x910, 0x910, 0x900, 0x8f0,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
46 0x8d0, 0x8b0, 0x840, 0x7f0, 0x790, 0x760, 0x7a0, 0x7c0, 0x7b0, 0x720}
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
47 };
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
48
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
49 static int8_t baptab[305] = {
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
50 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
51 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
52 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
53 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
54 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
55 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, /* 93 padding elems */
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
56
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
57 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
58 14, 12, 12, 12, 12, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
59 9, 8, 8, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
60 5, 4, 4, -3, -3, 3, 3, 3, -2, -2, -1, -1, -1, -1, -1, 0,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
61
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
62 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
63 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
64 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
65 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
66 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
67 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
68 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
69 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
70 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
71 0, 0, 0, 0 /* 148 padding elems */
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
72 };
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
73
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
74 static int bndtab[30] = {21, 22, 23, 24, 25, 26, 27, 28, 31, 34,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
75 37, 40, 43, 46, 49, 55, 61, 67, 73, 79,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
76 85, 97, 109, 121, 133, 157, 181, 205, 229, 253};
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
77
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
78 static int8_t latab[256] = {
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
79 -64, -63, -62, -61, -60, -59, -58, -57, -56, -55, -54, -53,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
80 -52, -52, -51, -50, -49, -48, -47, -47, -46, -45, -44, -44,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
81 -43, -42, -41, -41, -40, -39, -38, -38, -37, -36, -36, -35,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
82 -35, -34, -33, -33, -32, -32, -31, -30, -30, -29, -29, -28,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
83 -28, -27, -27, -26, -26, -25, -25, -24, -24, -23, -23, -22,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
84 -22, -21, -21, -21, -20, -20, -19, -19, -19, -18, -18, -18,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
85 -17, -17, -17, -16, -16, -16, -15, -15, -15, -14, -14, -14,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
86 -13, -13, -13, -13, -12, -12, -12, -12, -11, -11, -11, -11,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
87 -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -8, -8,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
88 -8, -8, -8, -8, -7, -7, -7, -7, -7, -7, -6, -6,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
89 -6, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -5,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
90 -5, -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
91 -4, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
92 -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
93 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
94 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
95 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
96 -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
97 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
98 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
99 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
100 0, 0, 0, 0
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
101 };
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
102
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
103 #define UPDATE_LEAK() \
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
104 do { \
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
105 fastleak += fdecay; \
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
106 if (fastleak > psd + fgain) \
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
107 fastleak = psd + fgain; \
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
108 slowleak += sdecay; \
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
109 if (slowleak > psd + sgain) \
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
110 slowleak = psd + sgain; \
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
111 } while (0)
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
112
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
113 #define COMPUTE_MASK() \
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
114 do { \
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
115 if (psd > dbknee) \
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
116 mask -= (psd - dbknee) >> 2; \
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
117 if (mask > hth [i >> halfrate]) \
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
118 mask = hth [i >> halfrate]; \
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
119 mask -= snroffset + 128 * deltba[i]; \
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
120 mask = (mask > 0) ? 0 : ((-mask) >> 5); \
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
121 mask -= floor; \
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
122 } while (0)
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
123
18720
4bad7f00556e sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents: 3394
diff changeset
124 void a52_bit_allocate (a52_state_t * state, ba_t * ba, int bndstart,
18721
722ac20fac5f sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents: 18720
diff changeset
125 int start, int end, int fastleak, int slowleak,
18720
4bad7f00556e sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents: 3394
diff changeset
126 expbap_t * expbap)
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
127 {
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
128 static int slowgain[4] = {0x540, 0x4d8, 0x478, 0x410};
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
129 static int dbpbtab[4] = {0xc00, 0x500, 0x300, 0x100};
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
130 static int floortab[8] = {0x910, 0x950, 0x990, 0x9d0,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
131 0xa10, 0xa90, 0xb10, 0x1400};
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
132
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
133 int i, j;
18720
4bad7f00556e sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents: 3394
diff changeset
134 uint8_t * exp;
4bad7f00556e sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents: 3394
diff changeset
135 int8_t * bap;
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
136 int fdecay, fgain, sdecay, sgain, dbknee, floor, snroffset;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
137 int psd, mask;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
138 int8_t * deltba;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
139 int * hth;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
140 int halfrate;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
141
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
142 halfrate = state->halfrate;
18720
4bad7f00556e sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents: 3394
diff changeset
143 fdecay = (63 + 20 * ((state->bai >> 7) & 3)) >> halfrate; /* fdcycod */
4bad7f00556e sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents: 3394
diff changeset
144 fgain = 128 + 128 * (ba->bai & 7); /* fgaincod */
4bad7f00556e sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents: 3394
diff changeset
145 sdecay = (15 + 2 * (state->bai >> 9)) >> halfrate; /* sdcycod */
4bad7f00556e sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents: 3394
diff changeset
146 sgain = slowgain[(state->bai >> 5) & 3]; /* sgaincod */
4bad7f00556e sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents: 3394
diff changeset
147 dbknee = dbpbtab[(state->bai >> 3) & 3]; /* dbpbcod */
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
148 hth = hthtab[state->fscod];
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
149 /*
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
150 * if there is no delta bit allocation, make deltba point to an area
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
151 * known to contain zeroes. baptab+156 here.
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
152 */
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
153 deltba = (ba->deltbae == DELTA_BIT_NONE) ? baptab + 156 : ba->deltba;
18720
4bad7f00556e sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents: 3394
diff changeset
154 floor = floortab[state->bai & 7]; /* floorcod */
4bad7f00556e sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents: 3394
diff changeset
155 snroffset = 960 - 64 * state->csnroffst - 4 * (ba->bai >> 3) + floor;
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
156 floor >>= 5;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
157
18720
4bad7f00556e sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents: 3394
diff changeset
158 exp = expbap->exp;
4bad7f00556e sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents: 3394
diff changeset
159 bap = expbap->bap;
4bad7f00556e sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents: 3394
diff changeset
160
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
161 i = bndstart;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
162 j = start;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
163 if (start == 0) { /* not the coupling channel */
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
164 int lowcomp;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
165
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
166 lowcomp = 0;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
167 j = end - 1;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
168 do {
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
169 if (i < j) {
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
170 if (exp[i+1] == exp[i] - 2)
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
171 lowcomp = 384;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
172 else if (lowcomp && (exp[i+1] > exp[i]))
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
173 lowcomp -= 64;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
174 }
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
175 psd = 128 * exp[i];
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
176 mask = psd + fgain + lowcomp;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
177 COMPUTE_MASK ();
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
178 bap[i] = (baptab+156)[mask + 4 * exp[i]];
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
179 i++;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
180 } while ((i < 3) || ((i < 7) && (exp[i] > exp[i-1])));
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
181 fastleak = psd + fgain;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
182 slowleak = psd + sgain;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
183
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
184 while (i < 7) {
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
185 if (i < j) {
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
186 if (exp[i+1] == exp[i] - 2)
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
187 lowcomp = 384;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
188 else if (lowcomp && (exp[i+1] > exp[i]))
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
189 lowcomp -= 64;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
190 }
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
191 psd = 128 * exp[i];
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
192 UPDATE_LEAK ();
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
193 mask = ((fastleak + lowcomp < slowleak) ?
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
194 fastleak + lowcomp : slowleak);
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
195 COMPUTE_MASK ();
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
196 bap[i] = (baptab+156)[mask + 4 * exp[i]];
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
197 i++;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
198 }
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
199
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
200 if (end == 7) /* lfe channel */
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
201 return;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
202
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
203 do {
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
204 if (exp[i+1] == exp[i] - 2)
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
205 lowcomp = 320;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
206 else if (lowcomp && (exp[i+1] > exp[i]))
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
207 lowcomp -= 64;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
208 psd = 128 * exp[i];
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
209 UPDATE_LEAK ();
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
210 mask = ((fastleak + lowcomp < slowleak) ?
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
211 fastleak + lowcomp : slowleak);
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
212 COMPUTE_MASK ();
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
213 bap[i] = (baptab+156)[mask + 4 * exp[i]];
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
214 i++;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
215 } while (i < 20);
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
216
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
217 while (lowcomp > 128) { /* two iterations maximum */
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
218 lowcomp -= 128;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
219 psd = 128 * exp[i];
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
220 UPDATE_LEAK ();
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
221 mask = ((fastleak + lowcomp < slowleak) ?
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
222 fastleak + lowcomp : slowleak);
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
223 COMPUTE_MASK ();
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
224 bap[i] = (baptab+156)[mask + 4 * exp[i]];
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
225 i++;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
226 }
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
227 j = i;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
228 }
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
229
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
230 do {
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
231 int startband, endband;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
232
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
233 startband = j;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
234 endband = ((bndtab-20)[i] < end) ? (bndtab-20)[i] : end;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
235 psd = 128 * exp[j++];
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
236 while (j < endband) {
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
237 int next, delta;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
238
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
239 next = 128 * exp[j++];
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
240 delta = next - psd;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
241 switch (delta >> 9) {
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
242 case -6: case -5: case -4: case -3: case -2:
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
243 psd = next;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
244 break;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
245 case -1:
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
246 psd = next + latab[(-delta) >> 1];
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
247 break;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
248 case 0:
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
249 psd += latab[delta >> 1];
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
250 break;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
251 }
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
252 }
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
253 /* minpsd = -289 */
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
254 UPDATE_LEAK ();
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
255 mask = (fastleak < slowleak) ? fastleak : slowleak;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
256 COMPUTE_MASK ();
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
257 i++;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
258 j = startband;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
259 do {
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
260 /* max(mask+4*exp)=147=-(minpsd+fgain-deltba-snroffset)>>5+4*exp */
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
261 /* min(mask+4*exp)=-156=-(sgain-deltba-snroffset)>>5 */
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
262 bap[j] = (baptab+156)[mask + 4 * exp[j]];
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
263 } while (++j < endband);
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
264 } while (j < end);
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
265 }