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
28 #include "bitstream.h"
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 int ff_vorbis_len2vlc(uint8_t *bits
, uint32_t *codes
, uint_fast32_t num
) {
49 uint_fast32_t exit_at_level
[33]={404,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
50 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
59 for(p
=0;(bits
[p
]==0) && (p
<num
);++p
);
61 // av_log(vc->avccontext, AV_LOG_INFO, "An empty codebook. Heh?! \n");
66 for(i
=0;i
<bits
[p
];++i
) {
67 exit_at_level
[i
+1]=1<<i
;
71 av_log(NULL
, AV_LOG_INFO
, " %d. of %d code len %d code %d - ", p
, num
, bits
[p
], codes
[p
]);
72 init_get_bits(&gb
, (uint_fast8_t *)&codes
[p
], bits
[p
]);
73 for(i
=0;i
<bits
[p
];++i
) {
74 av_log(NULL
, AV_LOG_INFO
, "%s", get_bits1(&gb
) ? "1" : "0");
76 av_log(NULL
, AV_LOG_INFO
, "\n");
82 if (bits
[p
]==0) continue;
83 // find corresponding exit(node which the tree can grow further from)
84 for(i
=bits
[p
];i
>0;--i
) {
85 if (exit_at_level
[i
]) break;
87 if (!i
) return 1; // overspecified tree
88 code
=exit_at_level
[i
];
90 // construct code (append 0s to end) and introduce new exits
91 for(j
=i
+1;j
<=bits
[p
];++j
) {
92 exit_at_level
[j
]=code
+(1<<(j
-1));
97 av_log(NULL
, AV_LOG_INFO
, " %d. code len %d code %d - ", p
, bits
[p
], codes
[p
]);
98 init_get_bits(&gb
, (uint_fast8_t *)&codes
[p
], bits
[p
]);
99 for(i
=0;i
<bits
[p
];++i
) {
100 av_log(NULL
, AV_LOG_INFO
, "%s", get_bits1(&gb
) ? "1" : "0");
102 av_log(NULL
, AV_LOG_INFO
, "\n");
107 //no exits should be left (underspecified tree - ie. unused valid vlcs - not allowed by SPEC)
109 if (exit_at_level
[p
]) return 1;
114 void ff_vorbis_ready_floor1_list(floor1_entry_t
* list
, int values
) {
118 for (i
= 2; i
< values
; i
++) {
123 for (j
= 2; j
< i
; j
++) {
125 if (tmp
< list
[i
].x
) {
126 if (tmp
> list
[list
[i
].low
].x
) list
[i
].low
= j
;
128 if (tmp
< list
[list
[i
].high
].x
) list
[i
].high
= j
;
132 for (i
= 0; i
< values
- 1; i
++) {
134 for (j
= i
+ 1; j
< values
; j
++) {
135 if (list
[list
[i
].sort
].x
> list
[list
[j
].sort
].x
) {
136 int tmp
= list
[i
].sort
;
137 list
[i
].sort
= list
[j
].sort
;
144 static void render_line(int x0
, int y0
, int x1
, int y1
, float * buf
) {
148 int ady
= FFABS(dy
) - FFABS(base
) * adx
;
152 int sy
= dy
<0 ? -1 : 1;
153 buf
[x
] = ff_vorbis_floor1_inverse_db_table
[y
];
161 buf
[x
] = ff_vorbis_floor1_inverse_db_table
[y
];
165 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
) {
168 ly
= y_list
[0] * multiplier
;
169 for (i
= 1; i
< values
; i
++) {
170 int pos
= list
[i
].sort
;
172 int x1
= list
[pos
].x
;
173 int y1
= y_list
[pos
] * multiplier
;
175 render_line(lx
, ly
, FFMIN(x1
,samples
), y1
, out
);
179 if (lx
>= samples
) break;
181 if (lx
< samples
) render_line(lx
, ly
, samples
, ly
, out
);