3 * Common code for Vorbis I encoder and decoder
4 * @author Denes Balatoni ( dbalatoni programozo hu )
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 #define ALT_BITSTREAM_READER_LE
33 /* Helper functions */
36 unsigned int ff_vorbis_nth_root(unsigned int x
, unsigned int n
)
38 unsigned int ret
= 0, i
, j
;
42 for (i
= 0, j
= ret
; i
< n
- 1; i
++)
49 // Generate vlc codes from vorbis huffman code lengths
51 // the two bits[p] > 32 checks should be redundant, all calling code should
52 // already ensure that, but since it allows overwriting the stack it seems
53 // reasonable to check redundantly.
54 int ff_vorbis_len2vlc(uint8_t *bits
, uint32_t *codes
, uint_fast32_t num
)
56 uint_fast32_t exit_at_level
[33] = {
57 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
58 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
61 uint_fast32_t code
, p
;
67 for (p
= 0; (bits
[p
] == 0) && (p
< num
); ++p
)
70 // av_log(vc->avccontext, AV_LOG_INFO, "An empty codebook. Heh?! \n");
77 for (i
= 0; i
< bits
[p
]; ++i
)
78 exit_at_level
[i
+1] = 1 << i
;
81 av_log(NULL
, AV_LOG_INFO
, " %d. of %d code len %d code %d - ", p
, num
, bits
[p
], codes
[p
]);
82 init_get_bits(&gb
, (uint_fast8_t *)&codes
[p
], bits
[p
]);
83 for (i
= 0; i
< bits
[p
]; ++i
)
84 av_log(NULL
, AV_LOG_INFO
, "%s", get_bits1(&gb
) ? "1" : "0");
85 av_log(NULL
, AV_LOG_INFO
, "\n");
90 for (; p
< num
; ++p
) {
95 // find corresponding exit(node which the tree can grow further from)
96 for (i
= bits
[p
]; i
> 0; --i
)
99 if (!i
) // overspecified tree
101 code
= exit_at_level
[i
];
102 exit_at_level
[i
] = 0;
103 // construct code (append 0s to end) and introduce new exits
104 for (j
= i
+ 1 ;j
<= bits
[p
]; ++j
)
105 exit_at_level
[j
] = code
+ (1 << (j
- 1));
109 av_log(NULL
, AV_LOG_INFO
, " %d. code len %d code %d - ", p
, bits
[p
], codes
[p
]);
110 init_get_bits(&gb
, (uint_fast8_t *)&codes
[p
], bits
[p
]);
111 for (i
= 0; i
< bits
[p
]; ++i
)
112 av_log(NULL
, AV_LOG_INFO
, "%s", get_bits1(&gb
) ? "1" : "0");
113 av_log(NULL
, AV_LOG_INFO
, "\n");
118 //no exits should be left (underspecified tree - ie. unused valid vlcs - not allowed by SPEC)
119 for (p
= 1; p
< 33; p
++)
120 if (exit_at_level
[p
])
126 void ff_vorbis_ready_floor1_list(vorbis_floor1_entry
* list
, int values
)
131 for (i
= 2; i
< values
; i
++) {
136 for (j
= 2; j
< i
; j
++) {
138 if (tmp
< list
[i
].x
) {
139 if (tmp
> list
[list
[i
].low
].x
)
142 if (tmp
< list
[list
[i
].high
].x
)
147 for (i
= 0; i
< values
- 1; i
++) {
149 for (j
= i
+ 1; j
< values
; j
++) {
150 if (list
[list
[i
].sort
].x
> list
[list
[j
].sort
].x
) {
151 int tmp
= list
[i
].sort
;
152 list
[i
].sort
= list
[j
].sort
;
159 static inline void render_line_unrolled(intptr_t x
, intptr_t y
, int x1
,
160 intptr_t sy
, int ady
, int adx
,
171 buf
[x
++] = ff_vorbis_floor1_inverse_db_table
[y
];
173 buf
[x
] = ff_vorbis_floor1_inverse_db_table
[y
];
178 buf
[x
] = ff_vorbis_floor1_inverse_db_table
[y
];
182 static void render_line(int x0
, int y0
, int x1
, int y1
, float *buf
)
187 int sy
= dy
< 0 ? -1 : 1;
188 buf
[x0
] = ff_vorbis_floor1_inverse_db_table
[y0
];
189 if (ady
*2 <= adx
) { // optimized common case
190 render_line_unrolled(x0
, y0
, x1
, sy
, ady
, adx
, buf
);
196 ady
-= FFABS(base
) * adx
;
204 buf
[x
] = ff_vorbis_floor1_inverse_db_table
[y
];
209 void ff_vorbis_floor1_render_list(vorbis_floor1_entry
* list
, int values
,
210 uint_fast16_t *y_list
, int *flag
,
211 int multiplier
, float *out
, int samples
)
215 ly
= y_list
[0] * multiplier
;
216 for (i
= 1; i
< values
; i
++) {
217 int pos
= list
[i
].sort
;
219 int x1
= list
[pos
].x
;
220 int y1
= y_list
[pos
] * multiplier
;
222 render_line(lx
, ly
, FFMIN(x1
,samples
), y1
, out
);
230 render_line(lx
, ly
, samples
, ly
, out
);