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
27 #define ALT_BITSTREAM_READER_LE
29 #include "bitstream.h"
34 /* Helper functions */
36 unsigned int ff_vorbis_nth_root(unsigned int x
, unsigned int n
) { // x^(1/n)
37 unsigned int ret
=0, i
, j
;
41 for(i
=0,j
=ret
;i
<n
-1;i
++) j
*=ret
;
47 // Generate vlc codes from vorbis huffman code lengths
49 int ff_vorbis_len2vlc(uint8_t *bits
, uint32_t *codes
, uint_fast32_t num
) {
50 uint_fast32_t exit_at_level
[33]={404,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
51 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
60 for(p
=0;(bits
[p
]==0) && (p
<num
);++p
);
62 // av_log(vc->avccontext, AV_LOG_INFO, "An empty codebook. Heh?! \n");
67 for(i
=0;i
<bits
[p
];++i
) {
68 exit_at_level
[i
+1]=1<<i
;
72 av_log(NULL
, AV_LOG_INFO
, " %d. of %d code len %d code %d - ", p
, num
, bits
[p
], codes
[p
]);
73 init_get_bits(&gb
, (uint_fast8_t *)&codes
[p
], bits
[p
]);
74 for(i
=0;i
<bits
[p
];++i
) {
75 av_log(NULL
, AV_LOG_INFO
, "%s", get_bits1(&gb
) ? "1" : "0");
77 av_log(NULL
, AV_LOG_INFO
, "\n");
83 if (bits
[p
]==0) continue;
84 // find corresponding exit(node which the tree can grow further from)
85 for(i
=bits
[p
];i
>0;--i
) {
86 if (exit_at_level
[i
]) break;
88 if (!i
) return 1; // overspecified tree
89 code
=exit_at_level
[i
];
91 // construct code (append 0s to end) and introduce new exits
92 for(j
=i
+1;j
<=bits
[p
];++j
) {
93 exit_at_level
[j
]=code
+(1<<(j
-1));
98 av_log(NULL
, AV_LOG_INFO
, " %d. code len %d code %d - ", p
, bits
[p
], codes
[p
]);
99 init_get_bits(&gb
, (uint_fast8_t *)&codes
[p
], bits
[p
]);
100 for(i
=0;i
<bits
[p
];++i
) {
101 av_log(NULL
, AV_LOG_INFO
, "%s", get_bits1(&gb
) ? "1" : "0");
103 av_log(NULL
, AV_LOG_INFO
, "\n");
108 //no exits should be left (underspecified tree - ie. unused valid vlcs - not allowed by SPEC)
110 if (exit_at_level
[p
]) return 1;
115 void ff_vorbis_ready_floor1_list(floor1_entry_t
* list
, int values
) {
119 for (i
= 2; i
< values
; i
++) {
124 for (j
= 2; j
< i
; j
++) {
126 if (tmp
< list
[i
].x
) {
127 if (tmp
> list
[list
[i
].low
].x
) list
[i
].low
= j
;
129 if (tmp
< list
[list
[i
].high
].x
) list
[i
].high
= j
;
133 for (i
= 0; i
< values
- 1; i
++) {
135 for (j
= i
+ 1; j
< values
; j
++) {
136 if (list
[list
[i
].sort
].x
> list
[list
[j
].sort
].x
) {
137 int tmp
= list
[i
].sort
;
138 list
[i
].sort
= list
[j
].sort
;
145 static void render_line(int x0
, int y0
, int x1
, int y1
, float * buf
, int n
) {
154 if (dy
< 0) sy
= base
- 1;
156 ady
= ady
- FFABS(base
) * adx
;
158 buf
[x
] = ff_vorbis_floor1_inverse_db_table
[y
];
159 for (x
= x0
+ 1; x
< x1
; x
++) {
168 buf
[x
] = ff_vorbis_floor1_inverse_db_table
[y
];
172 void ff_vorbis_floor1_render_list(floor1_entry_t
* list
, int values
, uint_fast16_t * y_list
, int * flag
, int multiplier
, float * out
, int samples
) {
175 ly
= y_list
[0] * multiplier
;
176 for (i
= 1; i
< values
; i
++) {
177 int pos
= list
[i
].sort
;
179 render_line(lx
, ly
, list
[pos
].x
, y_list
[pos
] * multiplier
, out
, samples
);
181 ly
= y_list
[pos
] * multiplier
;
183 if (lx
>= samples
) break;
185 if (lx
< samples
) render_line(lx
, ly
, samples
, ly
, out
, samples
);