00001
00029 #define BITSTREAM_READER_LE
00030 #include "avcodec.h"
00031 #include "get_bits.h"
00032
00033 #include "vorbis.h"
00034
00035
00036
00037
00038
00039 unsigned int ff_vorbis_nth_root(unsigned int x, unsigned int n)
00040 {
00041 unsigned int ret = 0, i, j;
00042
00043 do {
00044 ++ret;
00045 for (i = 0, j = ret; i < n - 1; i++)
00046 j *= ret;
00047 } while (j <= x);
00048
00049 return ret - 1;
00050 }
00051
00052
00053
00054
00055
00056
00057 int ff_vorbis_len2vlc(uint8_t *bits, uint32_t *codes, unsigned num)
00058 {
00059 uint32_t exit_at_level[33] = { 404 };
00060
00061 unsigned i, j, p, code;
00062
00063 #ifdef DEBUG
00064 GetBitContext gb;
00065 #endif
00066
00067 for (p = 0; (bits[p] == 0) && (p < num); ++p)
00068 ;
00069 if (p == num)
00070 return 0;
00071
00072 codes[p] = 0;
00073 if (bits[p] > 32)
00074 return 1;
00075 for (i = 0; i < bits[p]; ++i)
00076 exit_at_level[i+1] = 1 << i;
00077
00078 #ifdef DEBUG
00079 av_log(NULL, AV_LOG_INFO, " %u. of %u code len %d code %d - ", p, num, bits[p], codes[p]);
00080 init_get_bits(&gb, (uint8_t *)&codes[p], bits[p]);
00081 for (i = 0; i < bits[p]; ++i)
00082 av_log(NULL, AV_LOG_INFO, "%s", get_bits1(&gb) ? "1" : "0");
00083 av_log(NULL, AV_LOG_INFO, "\n");
00084 #endif
00085
00086 ++p;
00087
00088 for (; p < num; ++p) {
00089 if (bits[p] > 32)
00090 return 1;
00091 if (bits[p] == 0)
00092 continue;
00093
00094 for (i = bits[p]; i > 0; --i)
00095 if (exit_at_level[i])
00096 break;
00097 if (!i)
00098 return 1;
00099 code = exit_at_level[i];
00100 exit_at_level[i] = 0;
00101
00102 for (j = i + 1 ;j <= bits[p]; ++j)
00103 exit_at_level[j] = code + (1 << (j - 1));
00104 codes[p] = code;
00105
00106 #ifdef DEBUG
00107 av_log(NULL, AV_LOG_INFO, " %d. code len %d code %d - ", p, bits[p], codes[p]);
00108 init_get_bits(&gb, (uint8_t *)&codes[p], bits[p]);
00109 for (i = 0; i < bits[p]; ++i)
00110 av_log(NULL, AV_LOG_INFO, "%s", get_bits1(&gb) ? "1" : "0");
00111 av_log(NULL, AV_LOG_INFO, "\n");
00112 #endif
00113
00114 }
00115
00116
00117 for (p = 1; p < 33; p++)
00118 if (exit_at_level[p])
00119 return 1;
00120
00121 return 0;
00122 }
00123
00124 int ff_vorbis_ready_floor1_list(AVCodecContext *avccontext,
00125 vorbis_floor1_entry *list, int values)
00126 {
00127 int i;
00128 list[0].sort = 0;
00129 list[1].sort = 1;
00130 for (i = 2; i < values; i++) {
00131 int j;
00132 list[i].low = 0;
00133 list[i].high = 1;
00134 list[i].sort = i;
00135 for (j = 2; j < i; j++) {
00136 int tmp = list[j].x;
00137 if (tmp < list[i].x) {
00138 if (tmp > list[list[i].low].x)
00139 list[i].low = j;
00140 } else {
00141 if (tmp < list[list[i].high].x)
00142 list[i].high = j;
00143 }
00144 }
00145 }
00146 for (i = 0; i < values - 1; i++) {
00147 int j;
00148 for (j = i + 1; j < values; j++) {
00149 if (list[i].x == list[j].x) {
00150 av_log(avccontext, AV_LOG_ERROR,
00151 "Duplicate value found in floor 1 X coordinates\n");
00152 return AVERROR_INVALIDDATA;
00153 }
00154 if (list[list[i].sort].x > list[list[j].sort].x) {
00155 int tmp = list[i].sort;
00156 list[i].sort = list[j].sort;
00157 list[j].sort = tmp;
00158 }
00159 }
00160 }
00161 return 0;
00162 }
00163
00164 static inline void render_line_unrolled(intptr_t x, int y, int x1,
00165 intptr_t sy, int ady, int adx,
00166 float *buf)
00167 {
00168 int err = -adx;
00169 x -= x1 - 1;
00170 buf += x1 - 1;
00171 while (++x < 0) {
00172 err += ady;
00173 if (err >= 0) {
00174 err += ady - adx;
00175 y += sy;
00176 buf[x++] = ff_vorbis_floor1_inverse_db_table[av_clip_uint8(y)];
00177 }
00178 buf[x] = ff_vorbis_floor1_inverse_db_table[av_clip_uint8(y)];
00179 }
00180 if (x <= 0) {
00181 if (err + ady >= 0)
00182 y += sy;
00183 buf[x] = ff_vorbis_floor1_inverse_db_table[av_clip_uint8(y)];
00184 }
00185 }
00186
00187 static void render_line(int x0, int y0, int x1, int y1, float *buf)
00188 {
00189 int dy = y1 - y0;
00190 int adx = x1 - x0;
00191 int ady = FFABS(dy);
00192 int sy = dy < 0 ? -1 : 1;
00193 buf[x0] = ff_vorbis_floor1_inverse_db_table[av_clip_uint8(y0)];
00194 if (ady*2 <= adx) {
00195 render_line_unrolled(x0, y0, x1, sy, ady, adx, buf);
00196 } else {
00197 int base = dy / adx;
00198 int x = x0;
00199 int y = y0;
00200 int err = -adx;
00201 ady -= FFABS(base) * adx;
00202 while (++x < x1) {
00203 y += base;
00204 err += ady;
00205 if (err >= 0) {
00206 err -= adx;
00207 y += sy;
00208 }
00209 buf[x] = ff_vorbis_floor1_inverse_db_table[av_clip_uint8(y)];
00210 }
00211 }
00212 }
00213
00214 void ff_vorbis_floor1_render_list(vorbis_floor1_entry * list, int values,
00215 uint16_t *y_list, int *flag,
00216 int multiplier, float *out, int samples)
00217 {
00218 int lx, ly, i;
00219 lx = 0;
00220 ly = y_list[0] * multiplier;
00221 for (i = 1; i < values; i++) {
00222 int pos = list[i].sort;
00223 if (flag[pos]) {
00224 int x1 = list[pos].x;
00225 int y1 = y_list[pos] * multiplier;
00226 if (lx < samples)
00227 render_line(lx, ly, FFMIN(x1,samples), y1, out);
00228 lx = x1;
00229 ly = y1;
00230 }
00231 if (lx >= samples)
00232 break;
00233 }
00234 if (lx < samples)
00235 render_line(lx, ly, samples, ly, out);
00236 }