2 * This file is part of Libav.
4 * Libav is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * Libav is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with Libav; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 * Common code for Vorbis I encoder and decoder
22 * @author Denes Balatoni ( dbalatoni programozo hu )
25 #include "libavutil/common.h"
31 /* Helper functions */
34 unsigned int ff_vorbis_nth_root(unsigned int x
, unsigned int n
)
36 unsigned int ret
= 0, i
, j
;
40 for (i
= 0, j
= ret
; i
< n
- 1; i
++)
47 // Generate vlc codes from vorbis huffman code lengths
49 // the two bits[p] > 32 checks should be redundant, all calling code should
50 // already ensure that, but since it allows overwriting the stack it seems
51 // reasonable to check redundantly.
52 int ff_vorbis_len2vlc(uint8_t *bits
, uint32_t *codes
, unsigned num
)
54 uint32_t exit_at_level
[33] = { 404 };
55 unsigned i
, j
, p
, code
;
57 for (p
= 0; (bits
[p
] == 0) && (p
< num
); ++p
)
65 for (i
= 0; i
< bits
[p
]; ++i
)
66 exit_at_level
[i
+1] = 1 << i
;
70 for (; p
< num
; ++p
) {
75 // find corresponding exit(node which the tree can grow further from)
76 for (i
= bits
[p
]; i
> 0; --i
)
79 if (!i
) // overspecified tree
81 code
= exit_at_level
[i
];
83 // construct code (append 0s to end) and introduce new exits
84 for (j
= i
+ 1 ;j
<= bits
[p
]; ++j
)
85 exit_at_level
[j
] = code
+ (1 << (j
- 1));
89 //no exits should be left (underspecified tree - ie. unused valid vlcs - not allowed by SPEC)
90 for (p
= 1; p
< 33; p
++)
97 int ff_vorbis_ready_floor1_list(AVCodecContext
*avctx
,
98 vorbis_floor1_entry
*list
, int values
)
103 for (i
= 2; i
< values
; i
++) {
108 for (j
= 2; j
< i
; j
++) {
110 if (tmp
< list
[i
].x
) {
111 if (tmp
> list
[list
[i
].low
].x
)
114 if (tmp
< list
[list
[i
].high
].x
)
119 for (i
= 0; i
< values
- 1; i
++) {
121 for (j
= i
+ 1; j
< values
; j
++) {
122 if (list
[i
].x
== list
[j
].x
) {
123 av_log(avctx
, AV_LOG_ERROR
,
124 "Duplicate value found in floor 1 X coordinates\n");
125 return AVERROR_INVALIDDATA
;
127 if (list
[list
[i
].sort
].x
> list
[list
[j
].sort
].x
) {
128 int tmp
= list
[i
].sort
;
129 list
[i
].sort
= list
[j
].sort
;
137 static inline void render_line_unrolled(intptr_t x
, int y
, int x1
,
138 intptr_t sy
, int ady
, int adx
,
149 buf
[x
++] = ff_vorbis_floor1_inverse_db_table
[av_clip_uint8(y
)];
151 buf
[x
] = ff_vorbis_floor1_inverse_db_table
[av_clip_uint8(y
)];
156 buf
[x
] = ff_vorbis_floor1_inverse_db_table
[av_clip_uint8(y
)];
160 static void render_line(int x0
, int y0
, int x1
, int y1
, float *buf
)
165 int sy
= dy
< 0 ? -1 : 1;
166 buf
[x0
] = ff_vorbis_floor1_inverse_db_table
[av_clip_uint8(y0
)];
167 if (ady
*2 <= adx
) { // optimized common case
168 render_line_unrolled(x0
, y0
, x1
, sy
, ady
, adx
, buf
);
174 ady
-= FFABS(base
) * adx
;
182 buf
[x
] = ff_vorbis_floor1_inverse_db_table
[av_clip_uint8(y
)];
187 void ff_vorbis_floor1_render_list(vorbis_floor1_entry
* list
, int values
,
188 uint16_t *y_list
, int *flag
,
189 int multiplier
, float *out
, int samples
)
193 ly
= y_list
[0] * multiplier
;
194 for (i
= 1; i
< values
; i
++) {
195 int pos
= list
[i
].sort
;
197 int x1
= list
[pos
].x
;
198 int y1
= y_list
[pos
] * multiplier
;
200 render_line(lx
, ly
, FFMIN(x1
,samples
), y1
, out
);
208 render_line(lx
, ly
, samples
, ly
, out
);