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
25 * Common code for Vorbis I encoder and decoder
26 * @author Denes Balatoni ( dbalatoni programozo hu )
29 #define BITSTREAM_READER_LE
36 /* Helper functions */
39 unsigned int ff_vorbis_nth_root(unsigned int x
, unsigned int n
)
41 unsigned int ret
= 0, i
, j
;
45 for (i
= 0, j
= ret
; i
< n
- 1; i
++)
52 // Generate vlc codes from vorbis huffman code lengths
54 // the two bits[p] > 32 checks should be redundant, all calling code should
55 // already ensure that, but since it allows overwriting the stack it seems
56 // reasonable to check redundantly.
57 int ff_vorbis_len2vlc(uint8_t *bits
, uint32_t *codes
, unsigned num
)
59 uint32_t exit_at_level
[33] = { 404 };
61 unsigned i
, j
, p
, code
;
67 for (p
= 0; (bits
[p
] == 0) && (p
< num
); ++p
)
74 return AVERROR_INVALIDDATA
;
75 for (i
= 0; i
< bits
[p
]; ++i
)
76 exit_at_level
[i
+1] = 1 << i
;
79 av_log(NULL
, AV_LOG_INFO
, " %u. of %u code len %d code %d - ", p
, num
, bits
[p
], codes
[p
]);
80 init_get_bits(&gb
, (uint8_t *)&codes
[p
], bits
[p
]);
81 for (i
= 0; i
< bits
[p
]; ++i
)
82 av_log(NULL
, AV_LOG_INFO
, "%s", get_bits1(&gb
) ? "1" : "0");
83 av_log(NULL
, AV_LOG_INFO
, "\n");
88 for (i
= p
; (bits
[i
] == 0) && (i
< num
); ++i
)
93 for (; p
< num
; ++p
) {
95 return AVERROR_INVALIDDATA
;
98 // find corresponding exit(node which the tree can grow further from)
99 for (i
= bits
[p
]; i
> 0; --i
)
100 if (exit_at_level
[i
])
102 if (!i
) // overspecified tree
103 return AVERROR_INVALIDDATA
;
104 code
= exit_at_level
[i
];
105 exit_at_level
[i
] = 0;
106 // construct code (append 0s to end) and introduce new exits
107 for (j
= i
+ 1 ;j
<= bits
[p
]; ++j
)
108 exit_at_level
[j
] = code
+ (1 << (j
- 1));
112 av_log(NULL
, AV_LOG_INFO
, " %d. code len %d code %d - ", p
, bits
[p
], codes
[p
]);
113 init_get_bits(&gb
, (uint8_t *)&codes
[p
], bits
[p
]);
114 for (i
= 0; i
< bits
[p
]; ++i
)
115 av_log(NULL
, AV_LOG_INFO
, "%s", get_bits1(&gb
) ? "1" : "0");
116 av_log(NULL
, AV_LOG_INFO
, "\n");
121 //no exits should be left (underspecified tree - ie. unused valid vlcs - not allowed by SPEC)
122 for (p
= 1; p
< 33; p
++)
123 if (exit_at_level
[p
])
124 return AVERROR_INVALIDDATA
;
129 int ff_vorbis_ready_floor1_list(AVCodecContext
*avctx
,
130 vorbis_floor1_entry
*list
, int values
)
135 for (i
= 2; i
< values
; i
++) {
140 for (j
= 2; j
< i
; j
++) {
142 if (tmp
< list
[i
].x
) {
143 if (tmp
> list
[list
[i
].low
].x
)
146 if (tmp
< list
[list
[i
].high
].x
)
151 for (i
= 0; i
< values
- 1; i
++) {
153 for (j
= i
+ 1; j
< values
; j
++) {
154 if (list
[i
].x
== list
[j
].x
) {
155 av_log(avctx
, AV_LOG_ERROR
,
156 "Duplicate value found in floor 1 X coordinates\n");
157 return AVERROR_INVALIDDATA
;
159 if (list
[list
[i
].sort
].x
> list
[list
[j
].sort
].x
) {
160 int tmp
= list
[i
].sort
;
161 list
[i
].sort
= list
[j
].sort
;
169 static inline void render_line_unrolled(intptr_t x
, int y
, int x1
,
170 intptr_t sy
, int ady
, int adx
,
181 buf
[x
++] = ff_vorbis_floor1_inverse_db_table
[av_clip_uint8(y
)];
183 buf
[x
] = ff_vorbis_floor1_inverse_db_table
[av_clip_uint8(y
)];
188 buf
[x
] = ff_vorbis_floor1_inverse_db_table
[av_clip_uint8(y
)];
192 static void render_line(int x0
, int y0
, int x1
, int y1
, float *buf
)
197 int sy
= dy
< 0 ? -1 : 1;
198 buf
[x0
] = ff_vorbis_floor1_inverse_db_table
[av_clip_uint8(y0
)];
199 if (ady
*2 <= adx
) { // optimized common case
200 render_line_unrolled(x0
, y0
, x1
, sy
, ady
, adx
, buf
);
206 ady
-= FFABS(base
) * adx
;
214 buf
[x
] = ff_vorbis_floor1_inverse_db_table
[av_clip_uint8(y
)];
219 void ff_vorbis_floor1_render_list(vorbis_floor1_entry
* list
, int values
,
220 uint16_t *y_list
, int *flag
,
221 int multiplier
, float *out
, int samples
)
225 ly
= y_list
[0] * multiplier
;
226 for (i
= 1; i
< values
; i
++) {
227 int pos
= list
[i
].sort
;
229 int x1
= list
[pos
].x
;
230 int y1
= y_list
[pos
] * multiplier
;
232 render_line(lx
, ly
, FFMIN(x1
,samples
), y1
, out
);
240 render_line(lx
, ly
, samples
, ly
, out
);