annotate vorbis.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 7dd2a45249a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
1 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 10316
diff changeset
2 * @file
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
3 * Common code for Vorbis I encoder and decoder
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
4 * @author Denes Balatoni ( dbalatoni programozo hu )
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
5 *
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
6 * This file is part of FFmpeg.
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
7 *
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
12 *
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
16 * Lesser General Public License for more details.
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
17 *
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
21 */
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
22
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
23 #undef V_DEBUG
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
24 //#define V_DEBUG
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
25
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
26 #define ALT_BITSTREAM_READER_LE
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
27 #include "avcodec.h"
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 8718
diff changeset
28 #include "get_bits.h"
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
29
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
30 #include "vorbis.h"
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
31
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
32
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
33 /* Helper functions */
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
34
10309
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10119
diff changeset
35 // x^(1/n)
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10119
diff changeset
36 unsigned int ff_vorbis_nth_root(unsigned int x, unsigned int n)
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10119
diff changeset
37 {
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
38 unsigned int ret = 0, i, j;
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
39
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
40 do {
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
41 ++ret;
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
42 for (i = 0, j = ret; i < n - 1; i++)
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
43 j *= ret;
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
44 } while (j <= x);
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
45
6750
c93570aeb3eb Remove unnecessary parentheses from return calls.
diego
parents: 6340
diff changeset
46 return ret - 1;
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
47 }
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
48
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
49 // Generate vlc codes from vorbis huffman code lengths
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
50
9934
ff96ee73b08b Add extra validation checks to ff_vorbis_len2vlc.
reimar
parents: 9428
diff changeset
51 // the two bits[p] > 32 checks should be redundant, all calling code should
ff96ee73b08b Add extra validation checks to ff_vorbis_len2vlc.
reimar
parents: 9428
diff changeset
52 // already ensure that, but since it allows overwriting the stack it seems
ff96ee73b08b Add extra validation checks to ff_vorbis_len2vlc.
reimar
parents: 9428
diff changeset
53 // reasonable to check redundantly.
10309
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10119
diff changeset
54 int ff_vorbis_len2vlc(uint8_t *bits, uint32_t *codes, uint_fast32_t num)
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10119
diff changeset
55 {
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
56 uint_fast32_t exit_at_level[33] = {
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
57 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
58 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
59
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
60 uint_fast8_t i, j;
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
61 uint_fast32_t code, p;
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
62
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
63 #ifdef V_DEBUG
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
64 GetBitContext gb;
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
65 #endif
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
66
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
67 for (p = 0; (bits[p] == 0) && (p < num); ++p)
10310
d3644248015a some more linebreak and brace placement cosmetics
diego
parents: 10309
diff changeset
68 ;
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
69 if (p == num) {
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
70 // av_log(vc->avccontext, AV_LOG_INFO, "An empty codebook. Heh?! \n");
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
71 return 0;
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
72 }
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
73
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
74 codes[p] = 0;
10310
d3644248015a some more linebreak and brace placement cosmetics
diego
parents: 10309
diff changeset
75 if (bits[p] > 32)
d3644248015a some more linebreak and brace placement cosmetics
diego
parents: 10309
diff changeset
76 return 1;
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
77 for (i = 0; i < bits[p]; ++i)
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
78 exit_at_level[i+1] = 1 << i;
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
79
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
80 #ifdef V_DEBUG
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
81 av_log(NULL, AV_LOG_INFO, " %d. of %d code len %d code %d - ", p, num, bits[p], codes[p]);
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
82 init_get_bits(&gb, (uint_fast8_t *)&codes[p], bits[p]);
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
83 for (i = 0; i < bits[p]; ++i)
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
84 av_log(NULL, AV_LOG_INFO, "%s", get_bits1(&gb) ? "1" : "0");
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
85 av_log(NULL, AV_LOG_INFO, "\n");
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
86 #endif
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
87
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
88 ++p;
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
89
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
90 for (; p < num; ++p) {
10310
d3644248015a some more linebreak and brace placement cosmetics
diego
parents: 10309
diff changeset
91 if (bits[p] > 32)
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
92 return 1;
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
93 if (bits[p] == 0)
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
94 continue;
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
95 // find corresponding exit(node which the tree can grow further from)
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
96 for (i = bits[p]; i > 0; --i)
10310
d3644248015a some more linebreak and brace placement cosmetics
diego
parents: 10309
diff changeset
97 if (exit_at_level[i])
d3644248015a some more linebreak and brace placement cosmetics
diego
parents: 10309
diff changeset
98 break;
d3644248015a some more linebreak and brace placement cosmetics
diego
parents: 10309
diff changeset
99 if (!i) // overspecified tree
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
100 return 1;
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
101 code = exit_at_level[i];
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
102 exit_at_level[i] = 0;
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
103 // construct code (append 0s to end) and introduce new exits
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
104 for (j = i + 1 ;j <= bits[p]; ++j)
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
105 exit_at_level[j] = code + (1 << (j - 1));
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
106 codes[p] = code;
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
107
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
108 #ifdef V_DEBUG
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
109 av_log(NULL, AV_LOG_INFO, " %d. code len %d code %d - ", p, bits[p], codes[p]);
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
110 init_get_bits(&gb, (uint_fast8_t *)&codes[p], bits[p]);
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
111 for (i = 0; i < bits[p]; ++i)
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
112 av_log(NULL, AV_LOG_INFO, "%s", get_bits1(&gb) ? "1" : "0");
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
113 av_log(NULL, AV_LOG_INFO, "\n");
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
114 #endif
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
115
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
116 }
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
117
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
118 //no exits should be left (underspecified tree - ie. unused valid vlcs - not allowed by SPEC)
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
119 for (p = 1; p < 33; p++)
10310
d3644248015a some more linebreak and brace placement cosmetics
diego
parents: 10309
diff changeset
120 if (exit_at_level[p])
d3644248015a some more linebreak and brace placement cosmetics
diego
parents: 10309
diff changeset
121 return 1;
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
122
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
123 return 0;
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
124 }
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
125
10309
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10119
diff changeset
126 void ff_vorbis_ready_floor1_list(vorbis_floor1_entry * list, int values)
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10119
diff changeset
127 {
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
128 int i;
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
129 list[0].sort = 0;
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
130 list[1].sort = 1;
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
131 for (i = 2; i < values; i++) {
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
132 int j;
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
133 list[i].low = 0;
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
134 list[i].high = 1;
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
135 list[i].sort = i;
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
136 for (j = 2; j < i; j++) {
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
137 int tmp = list[j].x;
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
138 if (tmp < list[i].x) {
10310
d3644248015a some more linebreak and brace placement cosmetics
diego
parents: 10309
diff changeset
139 if (tmp > list[list[i].low].x)
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
140 list[i].low = j;
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
141 } else {
10310
d3644248015a some more linebreak and brace placement cosmetics
diego
parents: 10309
diff changeset
142 if (tmp < list[list[i].high].x)
d3644248015a some more linebreak and brace placement cosmetics
diego
parents: 10309
diff changeset
143 list[i].high = j;
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
144 }
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
145 }
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
146 }
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
147 for (i = 0; i < values - 1; i++) {
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
148 int j;
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
149 for (j = i + 1; j < values; j++) {
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
150 if (list[list[i].sort].x > list[list[j].sort].x) {
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
151 int tmp = list[i].sort;
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
152 list[i].sort = list[j].sort;
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
153 list[j].sort = tmp;
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
154 }
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
155 }
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
156 }
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
157 }
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
158
10309
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10119
diff changeset
159 static inline void render_line_unrolled(intptr_t x, intptr_t y, int x1,
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10119
diff changeset
160 intptr_t sy, int ady, int adx,
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
161 float *buf)
10309
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10119
diff changeset
162 {
10102
76eeb9e3599b 1.5x faster ff_vorbis_floor1_render_list, 5% faster vorbis decoding on Core2.
lorenm
parents: 9934
diff changeset
163 int err = -adx;
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
164 x -= x1 - 1;
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
165 buf += x1 - 1;
10102
76eeb9e3599b 1.5x faster ff_vorbis_floor1_render_list, 5% faster vorbis decoding on Core2.
lorenm
parents: 9934
diff changeset
166 while (++x < 0) {
76eeb9e3599b 1.5x faster ff_vorbis_floor1_render_list, 5% faster vorbis decoding on Core2.
lorenm
parents: 9934
diff changeset
167 err += ady;
76eeb9e3599b 1.5x faster ff_vorbis_floor1_render_list, 5% faster vorbis decoding on Core2.
lorenm
parents: 9934
diff changeset
168 if (err >= 0) {
76eeb9e3599b 1.5x faster ff_vorbis_floor1_render_list, 5% faster vorbis decoding on Core2.
lorenm
parents: 9934
diff changeset
169 err += ady - adx;
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
170 y += sy;
10102
76eeb9e3599b 1.5x faster ff_vorbis_floor1_render_list, 5% faster vorbis decoding on Core2.
lorenm
parents: 9934
diff changeset
171 buf[x++] = ff_vorbis_floor1_inverse_db_table[y];
76eeb9e3599b 1.5x faster ff_vorbis_floor1_render_list, 5% faster vorbis decoding on Core2.
lorenm
parents: 9934
diff changeset
172 }
76eeb9e3599b 1.5x faster ff_vorbis_floor1_render_list, 5% faster vorbis decoding on Core2.
lorenm
parents: 9934
diff changeset
173 buf[x] = ff_vorbis_floor1_inverse_db_table[y];
76eeb9e3599b 1.5x faster ff_vorbis_floor1_render_list, 5% faster vorbis decoding on Core2.
lorenm
parents: 9934
diff changeset
174 }
76eeb9e3599b 1.5x faster ff_vorbis_floor1_render_list, 5% faster vorbis decoding on Core2.
lorenm
parents: 9934
diff changeset
175 if (x <= 0) {
76eeb9e3599b 1.5x faster ff_vorbis_floor1_render_list, 5% faster vorbis decoding on Core2.
lorenm
parents: 9934
diff changeset
176 if (err + ady >= 0)
76eeb9e3599b 1.5x faster ff_vorbis_floor1_render_list, 5% faster vorbis decoding on Core2.
lorenm
parents: 9934
diff changeset
177 y += sy;
76eeb9e3599b 1.5x faster ff_vorbis_floor1_render_list, 5% faster vorbis decoding on Core2.
lorenm
parents: 9934
diff changeset
178 buf[x] = ff_vorbis_floor1_inverse_db_table[y];
76eeb9e3599b 1.5x faster ff_vorbis_floor1_render_list, 5% faster vorbis decoding on Core2.
lorenm
parents: 9934
diff changeset
179 }
76eeb9e3599b 1.5x faster ff_vorbis_floor1_render_list, 5% faster vorbis decoding on Core2.
lorenm
parents: 9934
diff changeset
180 }
76eeb9e3599b 1.5x faster ff_vorbis_floor1_render_list, 5% faster vorbis decoding on Core2.
lorenm
parents: 9934
diff changeset
181
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
182 static void render_line(int x0, int y0, int x1, int y1, float *buf)
10309
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10119
diff changeset
183 {
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
184 int dy = y1 - y0;
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
185 int adx = x1 - x0;
10102
76eeb9e3599b 1.5x faster ff_vorbis_floor1_render_list, 5% faster vorbis decoding on Core2.
lorenm
parents: 9934
diff changeset
186 int ady = FFABS(dy);
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
187 int sy = dy < 0 ? -1 : 1;
10102
76eeb9e3599b 1.5x faster ff_vorbis_floor1_render_list, 5% faster vorbis decoding on Core2.
lorenm
parents: 9934
diff changeset
188 buf[x0] = ff_vorbis_floor1_inverse_db_table[y0];
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
189 if (ady*2 <= adx) { // optimized common case
10102
76eeb9e3599b 1.5x faster ff_vorbis_floor1_render_list, 5% faster vorbis decoding on Core2.
lorenm
parents: 9934
diff changeset
190 render_line_unrolled(x0, y0, x1, sy, ady, adx, buf);
76eeb9e3599b 1.5x faster ff_vorbis_floor1_render_list, 5% faster vorbis decoding on Core2.
lorenm
parents: 9934
diff changeset
191 } else {
10103
lorenm
parents: 10102
diff changeset
192 int base = dy / adx;
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
193 int x = x0;
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
194 int y = y0;
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
195 int err = -adx;
10103
lorenm
parents: 10102
diff changeset
196 ady -= FFABS(base) * adx;
lorenm
parents: 10102
diff changeset
197 while (++x < x1) {
lorenm
parents: 10102
diff changeset
198 y += base;
lorenm
parents: 10102
diff changeset
199 err += ady;
lorenm
parents: 10102
diff changeset
200 if (err >= 0) {
lorenm
parents: 10102
diff changeset
201 err -= adx;
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
202 y += sy;
10103
lorenm
parents: 10102
diff changeset
203 }
lorenm
parents: 10102
diff changeset
204 buf[x] = ff_vorbis_floor1_inverse_db_table[y];
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
205 }
10102
76eeb9e3599b 1.5x faster ff_vorbis_floor1_render_list, 5% faster vorbis decoding on Core2.
lorenm
parents: 9934
diff changeset
206 }
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
207 }
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
208
10309
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10119
diff changeset
209 void ff_vorbis_floor1_render_list(vorbis_floor1_entry * list, int values,
10316
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
210 uint_fast16_t *y_list, int *flag,
7bfcc66f807d whitespace cosmetics, prettyprinting, K&R coding style
diego
parents: 10310
diff changeset
211 int multiplier, float *out, int samples)
10309
d157ccc267e7 brace placement and linebreak cosmetics
diego
parents: 10119
diff changeset
212 {
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
213 int lx, ly, i;
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
214 lx = 0;
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
215 ly = y_list[0] * multiplier;
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
216 for (i = 1; i < values; i++) {
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
217 int pos = list[i].sort;
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
218 if (flag[pos]) {
6340
575e0a847f0c 30% faster ff_vorbis_floor1_render_list, 3% faster overall
lorenm
parents: 5215
diff changeset
219 int x1 = list[pos].x;
575e0a847f0c 30% faster ff_vorbis_floor1_render_list, 3% faster overall
lorenm
parents: 5215
diff changeset
220 int y1 = y_list[pos] * multiplier;
575e0a847f0c 30% faster ff_vorbis_floor1_render_list, 3% faster overall
lorenm
parents: 5215
diff changeset
221 if (lx < samples)
575e0a847f0c 30% faster ff_vorbis_floor1_render_list, 3% faster overall
lorenm
parents: 5215
diff changeset
222 render_line(lx, ly, FFMIN(x1,samples), y1, out);
575e0a847f0c 30% faster ff_vorbis_floor1_render_list, 3% faster overall
lorenm
parents: 5215
diff changeset
223 lx = x1;
575e0a847f0c 30% faster ff_vorbis_floor1_render_list, 3% faster overall
lorenm
parents: 5215
diff changeset
224 ly = y1;
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
225 }
10310
d3644248015a some more linebreak and brace placement cosmetics
diego
parents: 10309
diff changeset
226 if (lx >= samples)
d3644248015a some more linebreak and brace placement cosmetics
diego
parents: 10309
diff changeset
227 break;
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
228 }
10310
d3644248015a some more linebreak and brace placement cosmetics
diego
parents: 10309
diff changeset
229 if (lx < samples)
d3644248015a some more linebreak and brace placement cosmetics
diego
parents: 10309
diff changeset
230 render_line(lx, ly, samples, ly, out);
4971
cb647e7b4b8b loosen vorbis_enc.c dependencies by spliting vorbis.c
aurel
parents:
diff changeset
231 }