2 * @file libavcodec/vorbis.c
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 */
35 unsigned int ff_vorbis_nth_root(unsigned int x
, unsigned int n
) { // x^(1/n)
36 unsigned int ret
=0, i
, j
;
40 for(i
=0,j
=ret
;i
<n
-1;i
++) j
*=ret
;
46 // Generate vlc codes from vorbis huffman code lengths
48 // the two bits[p] > 32 checks should be redundant, all calling code should
49 // already ensure that, but since it allows overwriting the stack it seems
50 // reasonable to check redundantly.
51 int ff_vorbis_len2vlc(uint8_t *bits
, uint32_t *codes
, uint_fast32_t num
) {
52 uint_fast32_t exit_at_level
[33]={404,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
53 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
62 for(p
=0;(bits
[p
]==0) && (p
<num
);++p
);
64 // av_log(vc->avccontext, AV_LOG_INFO, "An empty codebook. Heh?! \n");
69 if (bits
[p
] > 32) return 1;
70 for(i
=0;i
<bits
[p
];++i
) {
71 exit_at_level
[i
+1]=1<<i
;
75 av_log(NULL
, AV_LOG_INFO
, " %d. of %d code len %d code %d - ", p
, num
, bits
[p
], codes
[p
]);
76 init_get_bits(&gb
, (uint_fast8_t *)&codes
[p
], bits
[p
]);
77 for(i
=0;i
<bits
[p
];++i
) {
78 av_log(NULL
, AV_LOG_INFO
, "%s", get_bits1(&gb
) ? "1" : "0");
80 av_log(NULL
, AV_LOG_INFO
, "\n");
86 if (bits
[p
] > 32) return 1;
87 if (bits
[p
]==0) continue;
88 // find corresponding exit(node which the tree can grow further from)
89 for(i
=bits
[p
];i
>0;--i
) {
90 if (exit_at_level
[i
]) break;
92 if (!i
) return 1; // overspecified tree
93 code
=exit_at_level
[i
];
95 // construct code (append 0s to end) and introduce new exits
96 for(j
=i
+1;j
<=bits
[p
];++j
) {
97 exit_at_level
[j
]=code
+(1<<(j
-1));
102 av_log(NULL
, AV_LOG_INFO
, " %d. code len %d code %d - ", p
, bits
[p
], codes
[p
]);
103 init_get_bits(&gb
, (uint_fast8_t *)&codes
[p
], bits
[p
]);
104 for(i
=0;i
<bits
[p
];++i
) {
105 av_log(NULL
, AV_LOG_INFO
, "%s", get_bits1(&gb
) ? "1" : "0");
107 av_log(NULL
, AV_LOG_INFO
, "\n");
112 //no exits should be left (underspecified tree - ie. unused valid vlcs - not allowed by SPEC)
114 if (exit_at_level
[p
]) return 1;
119 void ff_vorbis_ready_floor1_list(vorbis_floor1_entry
* list
, int values
) {
123 for (i
= 2; i
< values
; i
++) {
128 for (j
= 2; j
< i
; j
++) {
130 if (tmp
< list
[i
].x
) {
131 if (tmp
> list
[list
[i
].low
].x
) list
[i
].low
= j
;
133 if (tmp
< list
[list
[i
].high
].x
) list
[i
].high
= j
;
137 for (i
= 0; i
< values
- 1; i
++) {
139 for (j
= i
+ 1; j
< values
; j
++) {
140 if (list
[list
[i
].sort
].x
> list
[list
[j
].sort
].x
) {
141 int tmp
= list
[i
].sort
;
142 list
[i
].sort
= list
[j
].sort
;
149 static inline void render_line_unrolled(intptr_t x
, intptr_t y
, int x1
, intptr_t sy
, int ady
, int adx
, float * buf
) {
158 buf
[x
++] = ff_vorbis_floor1_inverse_db_table
[y
];
160 buf
[x
] = ff_vorbis_floor1_inverse_db_table
[y
];
165 buf
[x
] = ff_vorbis_floor1_inverse_db_table
[y
];
169 static void render_line(int x0
, int y0
, int x1
, int y1
, float * buf
) {
173 int sy
= dy
<0 ? -1 : 1;
174 buf
[x0
] = ff_vorbis_floor1_inverse_db_table
[y0
];
175 if(ady
*2<=adx
) { // optimized common case
176 render_line_unrolled(x0
, y0
, x1
, sy
, ady
, adx
, buf
);
182 ady
-= FFABS(base
) * adx
;
190 buf
[x
] = ff_vorbis_floor1_inverse_db_table
[y
];
195 void ff_vorbis_floor1_render_list(vorbis_floor1_entry
* list
, int values
, uint_fast16_t * y_list
, int * flag
, int multiplier
, float * out
, int samples
) {
198 ly
= y_list
[0] * multiplier
;
199 for (i
= 1; i
< values
; i
++) {
200 int pos
= list
[i
].sort
;
202 int x1
= list
[pos
].x
;
203 int y1
= y_list
[pos
] * multiplier
;
205 render_line(lx
, ly
, FFMIN(x1
,samples
), y1
, out
);
209 if (lx
>= samples
) break;
211 if (lx
< samples
) render_line(lx
, ly
, samples
, ly
, out
);