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 #define BITSTREAM_READER_LE
32 /* Helper functions */
35 unsigned int ff_vorbis_nth_root(unsigned int x
, unsigned int n
)
37 unsigned int ret
= 0, i
, j
;
41 for (i
= 0, j
= ret
; i
< n
- 1; i
++)
48 // Generate vlc codes from vorbis huffman code lengths
50 // the two bits[p] > 32 checks should be redundant, all calling code should
51 // already ensure that, but since it allows overwriting the stack it seems
52 // reasonable to check redundantly.
53 int ff_vorbis_len2vlc(uint8_t *bits
, uint32_t *codes
, unsigned num
)
55 uint32_t exit_at_level
[33] = { 404 };
57 unsigned i
, j
, p
, code
;
63 for (p
= 0; (bits
[p
] == 0) && (p
< num
); ++p
)
71 for (i
= 0; i
< bits
[p
]; ++i
)
72 exit_at_level
[i
+1] = 1 << i
;
75 av_log(NULL
, AV_LOG_INFO
, " %u. of %u code len %d code %d - ", p
, num
, bits
[p
], codes
[p
]);
76 init_get_bits(&gb
, (uint8_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");
79 av_log(NULL
, AV_LOG_INFO
, "\n");
84 for (; p
< num
; ++p
) {
89 // find corresponding exit(node which the tree can grow further from)
90 for (i
= bits
[p
]; i
> 0; --i
)
93 if (!i
) // overspecified tree
95 code
= exit_at_level
[i
];
97 // construct code (append 0s to end) and introduce new exits
98 for (j
= i
+ 1 ;j
<= bits
[p
]; ++j
)
99 exit_at_level
[j
] = code
+ (1 << (j
- 1));
103 av_log(NULL
, AV_LOG_INFO
, " %d. code len %d code %d - ", p
, bits
[p
], codes
[p
]);
104 init_get_bits(&gb
, (uint8_t *)&codes
[p
], bits
[p
]);
105 for (i
= 0; i
< bits
[p
]; ++i
)
106 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)
113 for (p
= 1; p
< 33; p
++)
114 if (exit_at_level
[p
])
120 int ff_vorbis_ready_floor1_list(AVCodecContext
*avctx
,
121 vorbis_floor1_entry
*list
, int values
)
126 for (i
= 2; i
< values
; i
++) {
131 for (j
= 2; j
< i
; j
++) {
133 if (tmp
< list
[i
].x
) {
134 if (tmp
> list
[list
[i
].low
].x
)
137 if (tmp
< list
[list
[i
].high
].x
)
142 for (i
= 0; i
< values
- 1; i
++) {
144 for (j
= i
+ 1; j
< values
; j
++) {
145 if (list
[i
].x
== list
[j
].x
) {
146 av_log(avctx
, AV_LOG_ERROR
,
147 "Duplicate value found in floor 1 X coordinates\n");
148 return AVERROR_INVALIDDATA
;
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
;
160 static inline void render_line_unrolled(intptr_t x
, int y
, int x1
,
161 intptr_t sy
, int ady
, int adx
,
172 buf
[x
++] = ff_vorbis_floor1_inverse_db_table
[av_clip_uint8(y
)];
174 buf
[x
] = ff_vorbis_floor1_inverse_db_table
[av_clip_uint8(y
)];
179 buf
[x
] = ff_vorbis_floor1_inverse_db_table
[av_clip_uint8(y
)];
183 static void render_line(int x0
, int y0
, int x1
, int y1
, float *buf
)
188 int sy
= dy
< 0 ? -1 : 1;
189 buf
[x0
] = ff_vorbis_floor1_inverse_db_table
[av_clip_uint8(y0
)];
190 if (ady
*2 <= adx
) { // optimized common case
191 render_line_unrolled(x0
, y0
, x1
, sy
, ady
, adx
, buf
);
197 ady
-= FFABS(base
) * adx
;
205 buf
[x
] = ff_vorbis_floor1_inverse_db_table
[av_clip_uint8(y
)];
210 void ff_vorbis_floor1_render_list(vorbis_floor1_entry
* list
, int values
,
211 uint16_t *y_list
, int *flag
,
212 int multiplier
, float *out
, int samples
)
216 ly
= y_list
[0] * multiplier
;
217 for (i
= 1; i
< values
; i
++) {
218 int pos
= list
[i
].sort
;
220 int x1
= list
[pos
].x
;
221 int y1
= y_list
[pos
] * multiplier
;
223 render_line(lx
, ly
, FFMIN(x1
,samples
), y1
, out
);
231 render_line(lx
, ly
, samples
, ly
, out
);