annotate ffmpeg/libavcodec/vorbisdec.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /**
yading@10 2 * @file
yading@10 3 * Vorbis I decoder
yading@10 4 * @author Denes Balatoni ( dbalatoni programozo hu )
yading@10 5 *
yading@10 6 * This file is part of FFmpeg.
yading@10 7 *
yading@10 8 * FFmpeg is free software; you can redistribute it and/or
yading@10 9 * modify it under the terms of the GNU Lesser General Public
yading@10 10 * License as published by the Free Software Foundation; either
yading@10 11 * version 2.1 of the License, or (at your option) any later version.
yading@10 12 *
yading@10 13 * FFmpeg is distributed in the hope that it will be useful,
yading@10 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 16 * Lesser General Public License for more details.
yading@10 17 *
yading@10 18 * You should have received a copy of the GNU Lesser General Public
yading@10 19 * License along with FFmpeg; if not, write to the Free Software
yading@10 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 21 */
yading@10 22
yading@10 23 /**
yading@10 24 * @file
yading@10 25 * Vorbis I decoder
yading@10 26 * @author Denes Balatoni ( dbalatoni programozo hu )
yading@10 27 */
yading@10 28
yading@10 29 #include <inttypes.h>
yading@10 30 #include <math.h>
yading@10 31
yading@10 32 #define BITSTREAM_READER_LE
yading@10 33 #include "libavutil/float_dsp.h"
yading@10 34 #include "libavutil/avassert.h"
yading@10 35 #include "avcodec.h"
yading@10 36 #include "get_bits.h"
yading@10 37 #include "fft.h"
yading@10 38 #include "fmtconvert.h"
yading@10 39 #include "internal.h"
yading@10 40
yading@10 41 #include "vorbis.h"
yading@10 42 #include "vorbisdsp.h"
yading@10 43 #include "xiph.h"
yading@10 44
yading@10 45 #define V_NB_BITS 8
yading@10 46 #define V_NB_BITS2 11
yading@10 47 #define V_MAX_VLCS (1 << 16)
yading@10 48 #define V_MAX_PARTITIONS (1 << 20)
yading@10 49
yading@10 50 typedef struct {
yading@10 51 uint8_t dimensions;
yading@10 52 uint8_t lookup_type;
yading@10 53 uint8_t maxdepth;
yading@10 54 VLC vlc;
yading@10 55 float *codevectors;
yading@10 56 unsigned int nb_bits;
yading@10 57 } vorbis_codebook;
yading@10 58
yading@10 59 typedef union vorbis_floor_u vorbis_floor_data;
yading@10 60 typedef struct vorbis_floor0_s vorbis_floor0;
yading@10 61 typedef struct vorbis_floor1_s vorbis_floor1;
yading@10 62 struct vorbis_context_s;
yading@10 63 typedef
yading@10 64 int (* vorbis_floor_decode_func)
yading@10 65 (struct vorbis_context_s *, vorbis_floor_data *, float *);
yading@10 66 typedef struct {
yading@10 67 uint8_t floor_type;
yading@10 68 vorbis_floor_decode_func decode;
yading@10 69 union vorbis_floor_u {
yading@10 70 struct vorbis_floor0_s {
yading@10 71 uint8_t order;
yading@10 72 uint16_t rate;
yading@10 73 uint16_t bark_map_size;
yading@10 74 int32_t *map[2];
yading@10 75 uint32_t map_size[2];
yading@10 76 uint8_t amplitude_bits;
yading@10 77 uint8_t amplitude_offset;
yading@10 78 uint8_t num_books;
yading@10 79 uint8_t *book_list;
yading@10 80 float *lsp;
yading@10 81 } t0;
yading@10 82 struct vorbis_floor1_s {
yading@10 83 uint8_t partitions;
yading@10 84 uint8_t partition_class[32];
yading@10 85 uint8_t class_dimensions[16];
yading@10 86 uint8_t class_subclasses[16];
yading@10 87 uint8_t class_masterbook[16];
yading@10 88 int16_t subclass_books[16][8];
yading@10 89 uint8_t multiplier;
yading@10 90 uint16_t x_list_dim;
yading@10 91 vorbis_floor1_entry *list;
yading@10 92 } t1;
yading@10 93 } data;
yading@10 94 } vorbis_floor;
yading@10 95
yading@10 96 typedef struct {
yading@10 97 uint16_t type;
yading@10 98 uint32_t begin;
yading@10 99 uint32_t end;
yading@10 100 unsigned partition_size;
yading@10 101 uint8_t classifications;
yading@10 102 uint8_t classbook;
yading@10 103 int16_t books[64][8];
yading@10 104 uint8_t maxpass;
yading@10 105 uint16_t ptns_to_read;
yading@10 106 uint8_t *classifs;
yading@10 107 } vorbis_residue;
yading@10 108
yading@10 109 typedef struct {
yading@10 110 uint8_t submaps;
yading@10 111 uint16_t coupling_steps;
yading@10 112 uint8_t *magnitude;
yading@10 113 uint8_t *angle;
yading@10 114 uint8_t *mux;
yading@10 115 uint8_t submap_floor[16];
yading@10 116 uint8_t submap_residue[16];
yading@10 117 } vorbis_mapping;
yading@10 118
yading@10 119 typedef struct {
yading@10 120 uint8_t blockflag;
yading@10 121 uint16_t windowtype;
yading@10 122 uint16_t transformtype;
yading@10 123 uint8_t mapping;
yading@10 124 } vorbis_mode;
yading@10 125
yading@10 126 typedef struct vorbis_context_s {
yading@10 127 AVCodecContext *avctx;
yading@10 128 GetBitContext gb;
yading@10 129 VorbisDSPContext dsp;
yading@10 130 AVFloatDSPContext fdsp;
yading@10 131 FmtConvertContext fmt_conv;
yading@10 132
yading@10 133 FFTContext mdct[2];
yading@10 134 uint8_t first_frame;
yading@10 135 uint32_t version;
yading@10 136 uint8_t audio_channels;
yading@10 137 uint32_t audio_samplerate;
yading@10 138 uint32_t bitrate_maximum;
yading@10 139 uint32_t bitrate_nominal;
yading@10 140 uint32_t bitrate_minimum;
yading@10 141 uint32_t blocksize[2];
yading@10 142 const float *win[2];
yading@10 143 uint16_t codebook_count;
yading@10 144 vorbis_codebook *codebooks;
yading@10 145 uint8_t floor_count;
yading@10 146 vorbis_floor *floors;
yading@10 147 uint8_t residue_count;
yading@10 148 vorbis_residue *residues;
yading@10 149 uint8_t mapping_count;
yading@10 150 vorbis_mapping *mappings;
yading@10 151 uint8_t mode_count;
yading@10 152 vorbis_mode *modes;
yading@10 153 uint8_t mode_number; // mode number for the current packet
yading@10 154 uint8_t previous_window;
yading@10 155 float *channel_residues;
yading@10 156 float *saved;
yading@10 157 } vorbis_context;
yading@10 158
yading@10 159 /* Helper functions */
yading@10 160
yading@10 161 #define BARK(x) \
yading@10 162 (13.1f * atan(0.00074f * (x)) + 2.24f * atan(1.85e-8f * (x) * (x)) + 1e-4f * (x))
yading@10 163
yading@10 164 static const char idx_err_str[] = "Index value %d out of range (0 - %d) for %s at %s:%i\n";
yading@10 165 #define VALIDATE_INDEX(idx, limit) \
yading@10 166 if (idx >= limit) {\
yading@10 167 av_log(vc->avctx, AV_LOG_ERROR,\
yading@10 168 idx_err_str,\
yading@10 169 (int)(idx), (int)(limit - 1), #idx, __FILE__, __LINE__);\
yading@10 170 return AVERROR_INVALIDDATA;\
yading@10 171 }
yading@10 172 #define GET_VALIDATED_INDEX(idx, bits, limit) \
yading@10 173 {\
yading@10 174 idx = get_bits(gb, bits);\
yading@10 175 VALIDATE_INDEX(idx, limit)\
yading@10 176 }
yading@10 177
yading@10 178 static float vorbisfloat2float(unsigned val)
yading@10 179 {
yading@10 180 double mant = val & 0x1fffff;
yading@10 181 long exp = (val & 0x7fe00000L) >> 21;
yading@10 182 if (val & 0x80000000)
yading@10 183 mant = -mant;
yading@10 184 return ldexp(mant, exp - 20 - 768);
yading@10 185 }
yading@10 186
yading@10 187
yading@10 188 // Free all allocated memory -----------------------------------------
yading@10 189
yading@10 190 static void vorbis_free(vorbis_context *vc)
yading@10 191 {
yading@10 192 int i;
yading@10 193
yading@10 194 av_freep(&vc->channel_residues);
yading@10 195 av_freep(&vc->saved);
yading@10 196
yading@10 197 if (vc->residues)
yading@10 198 for (i = 0; i < vc->residue_count; i++)
yading@10 199 av_free(vc->residues[i].classifs);
yading@10 200 av_freep(&vc->residues);
yading@10 201 av_freep(&vc->modes);
yading@10 202
yading@10 203 ff_mdct_end(&vc->mdct[0]);
yading@10 204 ff_mdct_end(&vc->mdct[1]);
yading@10 205
yading@10 206 if (vc->codebooks)
yading@10 207 for (i = 0; i < vc->codebook_count; ++i) {
yading@10 208 av_free(vc->codebooks[i].codevectors);
yading@10 209 ff_free_vlc(&vc->codebooks[i].vlc);
yading@10 210 }
yading@10 211 av_freep(&vc->codebooks);
yading@10 212
yading@10 213 if (vc->floors)
yading@10 214 for (i = 0; i < vc->floor_count; ++i) {
yading@10 215 if (vc->floors[i].floor_type == 0) {
yading@10 216 av_free(vc->floors[i].data.t0.map[0]);
yading@10 217 av_free(vc->floors[i].data.t0.map[1]);
yading@10 218 av_free(vc->floors[i].data.t0.book_list);
yading@10 219 av_free(vc->floors[i].data.t0.lsp);
yading@10 220 } else {
yading@10 221 av_free(vc->floors[i].data.t1.list);
yading@10 222 }
yading@10 223 }
yading@10 224 av_freep(&vc->floors);
yading@10 225
yading@10 226 if (vc->mappings)
yading@10 227 for (i = 0; i < vc->mapping_count; ++i) {
yading@10 228 av_free(vc->mappings[i].magnitude);
yading@10 229 av_free(vc->mappings[i].angle);
yading@10 230 av_free(vc->mappings[i].mux);
yading@10 231 }
yading@10 232 av_freep(&vc->mappings);
yading@10 233 }
yading@10 234
yading@10 235 // Parse setup header -------------------------------------------------
yading@10 236
yading@10 237 // Process codebooks part
yading@10 238
yading@10 239 static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc)
yading@10 240 {
yading@10 241 unsigned cb;
yading@10 242 uint8_t *tmp_vlc_bits = NULL;
yading@10 243 uint32_t *tmp_vlc_codes = NULL;
yading@10 244 GetBitContext *gb = &vc->gb;
yading@10 245 uint16_t *codebook_multiplicands = NULL;
yading@10 246 int ret = 0;
yading@10 247
yading@10 248 vc->codebook_count = get_bits(gb, 8) + 1;
yading@10 249
yading@10 250 av_dlog(NULL, " Codebooks: %d \n", vc->codebook_count);
yading@10 251
yading@10 252 vc->codebooks = av_mallocz(vc->codebook_count * sizeof(*vc->codebooks));
yading@10 253 tmp_vlc_bits = av_mallocz(V_MAX_VLCS * sizeof(*tmp_vlc_bits));
yading@10 254 tmp_vlc_codes = av_mallocz(V_MAX_VLCS * sizeof(*tmp_vlc_codes));
yading@10 255 codebook_multiplicands = av_malloc(V_MAX_VLCS * sizeof(*codebook_multiplicands));
yading@10 256 if (!vc->codebooks ||
yading@10 257 !tmp_vlc_bits || !tmp_vlc_codes || !codebook_multiplicands) {
yading@10 258 ret = AVERROR(ENOMEM);
yading@10 259 goto error;
yading@10 260 }
yading@10 261
yading@10 262 for (cb = 0; cb < vc->codebook_count; ++cb) {
yading@10 263 vorbis_codebook *codebook_setup = &vc->codebooks[cb];
yading@10 264 unsigned ordered, t, entries, used_entries = 0;
yading@10 265
yading@10 266 av_dlog(NULL, " %u. Codebook\n", cb);
yading@10 267
yading@10 268 if (get_bits(gb, 24) != 0x564342) {
yading@10 269 av_log(vc->avctx, AV_LOG_ERROR,
yading@10 270 " %u. Codebook setup data corrupt.\n", cb);
yading@10 271 ret = AVERROR_INVALIDDATA;
yading@10 272 goto error;
yading@10 273 }
yading@10 274
yading@10 275 codebook_setup->dimensions=get_bits(gb, 16);
yading@10 276 if (codebook_setup->dimensions > 16 || codebook_setup->dimensions == 0) {
yading@10 277 av_log(vc->avctx, AV_LOG_ERROR,
yading@10 278 " %u. Codebook's dimension is invalid (%d).\n",
yading@10 279 cb, codebook_setup->dimensions);
yading@10 280 ret = AVERROR_INVALIDDATA;
yading@10 281 goto error;
yading@10 282 }
yading@10 283 entries = get_bits(gb, 24);
yading@10 284 if (entries > V_MAX_VLCS) {
yading@10 285 av_log(vc->avctx, AV_LOG_ERROR,
yading@10 286 " %u. Codebook has too many entries (%u).\n",
yading@10 287 cb, entries);
yading@10 288 ret = AVERROR_INVALIDDATA;
yading@10 289 goto error;
yading@10 290 }
yading@10 291
yading@10 292 ordered = get_bits1(gb);
yading@10 293
yading@10 294 av_dlog(NULL, " codebook_dimensions %d, codebook_entries %u\n",
yading@10 295 codebook_setup->dimensions, entries);
yading@10 296
yading@10 297 if (!ordered) {
yading@10 298 unsigned ce, flag;
yading@10 299 unsigned sparse = get_bits1(gb);
yading@10 300
yading@10 301 av_dlog(NULL, " not ordered \n");
yading@10 302
yading@10 303 if (sparse) {
yading@10 304 av_dlog(NULL, " sparse \n");
yading@10 305
yading@10 306 used_entries = 0;
yading@10 307 for (ce = 0; ce < entries; ++ce) {
yading@10 308 flag = get_bits1(gb);
yading@10 309 if (flag) {
yading@10 310 tmp_vlc_bits[ce] = get_bits(gb, 5) + 1;
yading@10 311 ++used_entries;
yading@10 312 } else
yading@10 313 tmp_vlc_bits[ce] = 0;
yading@10 314 }
yading@10 315 } else {
yading@10 316 av_dlog(NULL, " not sparse \n");
yading@10 317
yading@10 318 used_entries = entries;
yading@10 319 for (ce = 0; ce < entries; ++ce)
yading@10 320 tmp_vlc_bits[ce] = get_bits(gb, 5) + 1;
yading@10 321 }
yading@10 322 } else {
yading@10 323 unsigned current_entry = 0;
yading@10 324 unsigned current_length = get_bits(gb, 5) + 1;
yading@10 325
yading@10 326 av_dlog(NULL, " ordered, current length: %u\n", current_length); //FIXME
yading@10 327
yading@10 328 used_entries = entries;
yading@10 329 for (; current_entry < used_entries && current_length <= 32; ++current_length) {
yading@10 330 unsigned i, number;
yading@10 331
yading@10 332 av_dlog(NULL, " number bits: %u ", ilog(entries - current_entry));
yading@10 333
yading@10 334 number = get_bits(gb, ilog(entries - current_entry));
yading@10 335
yading@10 336 av_dlog(NULL, " number: %u\n", number);
yading@10 337
yading@10 338 for (i = current_entry; i < number+current_entry; ++i)
yading@10 339 if (i < used_entries)
yading@10 340 tmp_vlc_bits[i] = current_length;
yading@10 341
yading@10 342 current_entry+=number;
yading@10 343 }
yading@10 344 if (current_entry>used_entries) {
yading@10 345 av_log(vc->avctx, AV_LOG_ERROR, " More codelengths than codes in codebook. \n");
yading@10 346 ret = AVERROR_INVALIDDATA;
yading@10 347 goto error;
yading@10 348 }
yading@10 349 }
yading@10 350
yading@10 351 codebook_setup->lookup_type = get_bits(gb, 4);
yading@10 352
yading@10 353 av_dlog(NULL, " lookup type: %d : %s \n", codebook_setup->lookup_type,
yading@10 354 codebook_setup->lookup_type ? "vq" : "no lookup");
yading@10 355
yading@10 356 // If the codebook is used for (inverse) VQ, calculate codevectors.
yading@10 357
yading@10 358 if (codebook_setup->lookup_type == 1) {
yading@10 359 unsigned i, j, k;
yading@10 360 unsigned codebook_lookup_values = ff_vorbis_nth_root(entries, codebook_setup->dimensions);
yading@10 361
yading@10 362 float codebook_minimum_value = vorbisfloat2float(get_bits_long(gb, 32));
yading@10 363 float codebook_delta_value = vorbisfloat2float(get_bits_long(gb, 32));
yading@10 364 unsigned codebook_value_bits = get_bits(gb, 4) + 1;
yading@10 365 unsigned codebook_sequence_p = get_bits1(gb);
yading@10 366
yading@10 367 av_dlog(NULL, " We expect %d numbers for building the codevectors. \n",
yading@10 368 codebook_lookup_values);
yading@10 369 av_dlog(NULL, " delta %f minmum %f \n",
yading@10 370 codebook_delta_value, codebook_minimum_value);
yading@10 371
yading@10 372 for (i = 0; i < codebook_lookup_values; ++i) {
yading@10 373 codebook_multiplicands[i] = get_bits(gb, codebook_value_bits);
yading@10 374
yading@10 375 av_dlog(NULL, " multiplicands*delta+minmum : %e \n",
yading@10 376 (float)codebook_multiplicands[i] * codebook_delta_value + codebook_minimum_value);
yading@10 377 av_dlog(NULL, " multiplicand %u\n", codebook_multiplicands[i]);
yading@10 378 }
yading@10 379
yading@10 380 // Weed out unused vlcs and build codevector vector
yading@10 381 codebook_setup->codevectors = used_entries ? av_mallocz(used_entries *
yading@10 382 codebook_setup->dimensions *
yading@10 383 sizeof(*codebook_setup->codevectors))
yading@10 384 : NULL;
yading@10 385 for (j = 0, i = 0; i < entries; ++i) {
yading@10 386 unsigned dim = codebook_setup->dimensions;
yading@10 387
yading@10 388 if (tmp_vlc_bits[i]) {
yading@10 389 float last = 0.0;
yading@10 390 unsigned lookup_offset = i;
yading@10 391
yading@10 392 av_dlog(vc->avctx, "Lookup offset %u ,", i);
yading@10 393
yading@10 394 for (k = 0; k < dim; ++k) {
yading@10 395 unsigned multiplicand_offset = lookup_offset % codebook_lookup_values;
yading@10 396 codebook_setup->codevectors[j * dim + k] = codebook_multiplicands[multiplicand_offset] * codebook_delta_value + codebook_minimum_value + last;
yading@10 397 if (codebook_sequence_p)
yading@10 398 last = codebook_setup->codevectors[j * dim + k];
yading@10 399 lookup_offset/=codebook_lookup_values;
yading@10 400 }
yading@10 401 tmp_vlc_bits[j] = tmp_vlc_bits[i];
yading@10 402
yading@10 403 av_dlog(vc->avctx, "real lookup offset %u, vector: ", j);
yading@10 404 for (k = 0; k < dim; ++k)
yading@10 405 av_dlog(vc->avctx, " %f ",
yading@10 406 codebook_setup->codevectors[j * dim + k]);
yading@10 407 av_dlog(vc->avctx, "\n");
yading@10 408
yading@10 409 ++j;
yading@10 410 }
yading@10 411 }
yading@10 412 if (j != used_entries) {
yading@10 413 av_log(vc->avctx, AV_LOG_ERROR, "Bug in codevector vector building code. \n");
yading@10 414 ret = AVERROR_INVALIDDATA;
yading@10 415 goto error;
yading@10 416 }
yading@10 417 entries = used_entries;
yading@10 418 } else if (codebook_setup->lookup_type >= 2) {
yading@10 419 av_log(vc->avctx, AV_LOG_ERROR, "Codebook lookup type not supported. \n");
yading@10 420 ret = AVERROR_INVALIDDATA;
yading@10 421 goto error;
yading@10 422 }
yading@10 423
yading@10 424 // Initialize VLC table
yading@10 425 if (ff_vorbis_len2vlc(tmp_vlc_bits, tmp_vlc_codes, entries)) {
yading@10 426 av_log(vc->avctx, AV_LOG_ERROR, " Invalid code lengths while generating vlcs. \n");
yading@10 427 ret = AVERROR_INVALIDDATA;
yading@10 428 goto error;
yading@10 429 }
yading@10 430 codebook_setup->maxdepth = 0;
yading@10 431 for (t = 0; t < entries; ++t)
yading@10 432 if (tmp_vlc_bits[t] >= codebook_setup->maxdepth)
yading@10 433 codebook_setup->maxdepth = tmp_vlc_bits[t];
yading@10 434
yading@10 435 if (codebook_setup->maxdepth > 3 * V_NB_BITS)
yading@10 436 codebook_setup->nb_bits = V_NB_BITS2;
yading@10 437 else
yading@10 438 codebook_setup->nb_bits = V_NB_BITS;
yading@10 439
yading@10 440 codebook_setup->maxdepth = (codebook_setup->maxdepth+codebook_setup->nb_bits - 1) / codebook_setup->nb_bits;
yading@10 441
yading@10 442 if ((ret = init_vlc(&codebook_setup->vlc, codebook_setup->nb_bits,
yading@10 443 entries, tmp_vlc_bits, sizeof(*tmp_vlc_bits),
yading@10 444 sizeof(*tmp_vlc_bits), tmp_vlc_codes,
yading@10 445 sizeof(*tmp_vlc_codes), sizeof(*tmp_vlc_codes),
yading@10 446 INIT_VLC_LE))) {
yading@10 447 av_log(vc->avctx, AV_LOG_ERROR, " Error generating vlc tables. \n");
yading@10 448 goto error;
yading@10 449 }
yading@10 450 }
yading@10 451
yading@10 452 av_free(tmp_vlc_bits);
yading@10 453 av_free(tmp_vlc_codes);
yading@10 454 av_free(codebook_multiplicands);
yading@10 455 return 0;
yading@10 456
yading@10 457 // Error:
yading@10 458 error:
yading@10 459 av_free(tmp_vlc_bits);
yading@10 460 av_free(tmp_vlc_codes);
yading@10 461 av_free(codebook_multiplicands);
yading@10 462 return ret;
yading@10 463 }
yading@10 464
yading@10 465 // Process time domain transforms part (unused in Vorbis I)
yading@10 466
yading@10 467 static int vorbis_parse_setup_hdr_tdtransforms(vorbis_context *vc)
yading@10 468 {
yading@10 469 GetBitContext *gb = &vc->gb;
yading@10 470 unsigned i, vorbis_time_count = get_bits(gb, 6) + 1;
yading@10 471
yading@10 472 for (i = 0; i < vorbis_time_count; ++i) {
yading@10 473 unsigned vorbis_tdtransform = get_bits(gb, 16);
yading@10 474
yading@10 475 av_dlog(NULL, " Vorbis time domain transform %u: %u\n",
yading@10 476 vorbis_time_count, vorbis_tdtransform);
yading@10 477
yading@10 478 if (vorbis_tdtransform) {
yading@10 479 av_log(vc->avctx, AV_LOG_ERROR, "Vorbis time domain transform data nonzero. \n");
yading@10 480 return AVERROR_INVALIDDATA;
yading@10 481 }
yading@10 482 }
yading@10 483 return 0;
yading@10 484 }
yading@10 485
yading@10 486 // Process floors part
yading@10 487
yading@10 488 static int vorbis_floor0_decode(vorbis_context *vc,
yading@10 489 vorbis_floor_data *vfu, float *vec);
yading@10 490 static int create_map(vorbis_context *vc, unsigned floor_number);
yading@10 491 static int vorbis_floor1_decode(vorbis_context *vc,
yading@10 492 vorbis_floor_data *vfu, float *vec);
yading@10 493 static int vorbis_parse_setup_hdr_floors(vorbis_context *vc)
yading@10 494 {
yading@10 495 GetBitContext *gb = &vc->gb;
yading@10 496 int i, j, k, ret;
yading@10 497
yading@10 498 vc->floor_count = get_bits(gb, 6) + 1;
yading@10 499
yading@10 500 vc->floors = av_mallocz(vc->floor_count * sizeof(*vc->floors));
yading@10 501 if (!vc->floors)
yading@10 502 return AVERROR(ENOMEM);
yading@10 503
yading@10 504 for (i = 0; i < vc->floor_count; ++i) {
yading@10 505 vorbis_floor *floor_setup = &vc->floors[i];
yading@10 506
yading@10 507 floor_setup->floor_type = get_bits(gb, 16);
yading@10 508
yading@10 509 av_dlog(NULL, " %d. floor type %d \n", i, floor_setup->floor_type);
yading@10 510
yading@10 511 if (floor_setup->floor_type == 1) {
yading@10 512 int maximum_class = -1;
yading@10 513 unsigned rangebits, rangemax, floor1_values = 2;
yading@10 514
yading@10 515 floor_setup->decode = vorbis_floor1_decode;
yading@10 516
yading@10 517 floor_setup->data.t1.partitions = get_bits(gb, 5);
yading@10 518
yading@10 519 av_dlog(NULL, " %d.floor: %d partitions \n",
yading@10 520 i, floor_setup->data.t1.partitions);
yading@10 521
yading@10 522 for (j = 0; j < floor_setup->data.t1.partitions; ++j) {
yading@10 523 floor_setup->data.t1.partition_class[j] = get_bits(gb, 4);
yading@10 524 if (floor_setup->data.t1.partition_class[j] > maximum_class)
yading@10 525 maximum_class = floor_setup->data.t1.partition_class[j];
yading@10 526
yading@10 527 av_dlog(NULL, " %d. floor %d partition class %d \n",
yading@10 528 i, j, floor_setup->data.t1.partition_class[j]);
yading@10 529
yading@10 530 }
yading@10 531
yading@10 532 av_dlog(NULL, " maximum class %d \n", maximum_class);
yading@10 533
yading@10 534 for (j = 0; j <= maximum_class; ++j) {
yading@10 535 floor_setup->data.t1.class_dimensions[j] = get_bits(gb, 3) + 1;
yading@10 536 floor_setup->data.t1.class_subclasses[j] = get_bits(gb, 2);
yading@10 537
yading@10 538 av_dlog(NULL, " %d floor %d class dim: %d subclasses %d \n", i, j,
yading@10 539 floor_setup->data.t1.class_dimensions[j],
yading@10 540 floor_setup->data.t1.class_subclasses[j]);
yading@10 541
yading@10 542 if (floor_setup->data.t1.class_subclasses[j]) {
yading@10 543 GET_VALIDATED_INDEX(floor_setup->data.t1.class_masterbook[j], 8, vc->codebook_count)
yading@10 544
yading@10 545 av_dlog(NULL, " masterbook: %d \n", floor_setup->data.t1.class_masterbook[j]);
yading@10 546 }
yading@10 547
yading@10 548 for (k = 0; k < (1 << floor_setup->data.t1.class_subclasses[j]); ++k) {
yading@10 549 int16_t bits = get_bits(gb, 8) - 1;
yading@10 550 if (bits != -1)
yading@10 551 VALIDATE_INDEX(bits, vc->codebook_count)
yading@10 552 floor_setup->data.t1.subclass_books[j][k] = bits;
yading@10 553
yading@10 554 av_dlog(NULL, " book %d. : %d \n", k, floor_setup->data.t1.subclass_books[j][k]);
yading@10 555 }
yading@10 556 }
yading@10 557
yading@10 558 floor_setup->data.t1.multiplier = get_bits(gb, 2) + 1;
yading@10 559 floor_setup->data.t1.x_list_dim = 2;
yading@10 560
yading@10 561 for (j = 0; j < floor_setup->data.t1.partitions; ++j)
yading@10 562 floor_setup->data.t1.x_list_dim+=floor_setup->data.t1.class_dimensions[floor_setup->data.t1.partition_class[j]];
yading@10 563
yading@10 564 floor_setup->data.t1.list = av_mallocz(floor_setup->data.t1.x_list_dim *
yading@10 565 sizeof(*floor_setup->data.t1.list));
yading@10 566 if (!floor_setup->data.t1.list)
yading@10 567 return AVERROR(ENOMEM);
yading@10 568
yading@10 569 rangebits = get_bits(gb, 4);
yading@10 570 rangemax = (1 << rangebits);
yading@10 571 if (rangemax > vc->blocksize[1] / 2) {
yading@10 572 av_log(vc->avctx, AV_LOG_ERROR,
yading@10 573 "Floor value is too large for blocksize: %u (%"PRIu32")\n",
yading@10 574 rangemax, vc->blocksize[1] / 2);
yading@10 575 return AVERROR_INVALIDDATA;
yading@10 576 }
yading@10 577 floor_setup->data.t1.list[0].x = 0;
yading@10 578 floor_setup->data.t1.list[1].x = rangemax;
yading@10 579
yading@10 580 for (j = 0; j < floor_setup->data.t1.partitions; ++j) {
yading@10 581 for (k = 0; k < floor_setup->data.t1.class_dimensions[floor_setup->data.t1.partition_class[j]]; ++k, ++floor1_values) {
yading@10 582 floor_setup->data.t1.list[floor1_values].x = get_bits(gb, rangebits);
yading@10 583
yading@10 584 av_dlog(NULL, " %u. floor1 Y coord. %d\n", floor1_values,
yading@10 585 floor_setup->data.t1.list[floor1_values].x);
yading@10 586 }
yading@10 587 }
yading@10 588
yading@10 589 // Precalculate order of x coordinates - needed for decode
yading@10 590 if (ff_vorbis_ready_floor1_list(vc->avctx,
yading@10 591 floor_setup->data.t1.list,
yading@10 592 floor_setup->data.t1.x_list_dim)) {
yading@10 593 return AVERROR_INVALIDDATA;
yading@10 594 }
yading@10 595 } else if (floor_setup->floor_type == 0) {
yading@10 596 unsigned max_codebook_dim = 0;
yading@10 597
yading@10 598 floor_setup->decode = vorbis_floor0_decode;
yading@10 599
yading@10 600 floor_setup->data.t0.order = get_bits(gb, 8);
yading@10 601 if (!floor_setup->data.t0.order) {
yading@10 602 av_log(vc->avctx, AV_LOG_ERROR, "Floor 0 order is 0.\n");
yading@10 603 return AVERROR_INVALIDDATA;
yading@10 604 }
yading@10 605 floor_setup->data.t0.rate = get_bits(gb, 16);
yading@10 606 if (!floor_setup->data.t0.rate) {
yading@10 607 av_log(vc->avctx, AV_LOG_ERROR, "Floor 0 rate is 0.\n");
yading@10 608 return AVERROR_INVALIDDATA;
yading@10 609 }
yading@10 610 floor_setup->data.t0.bark_map_size = get_bits(gb, 16);
yading@10 611 if (!floor_setup->data.t0.bark_map_size) {
yading@10 612 av_log(vc->avctx, AV_LOG_ERROR,
yading@10 613 "Floor 0 bark map size is 0.\n");
yading@10 614 return AVERROR_INVALIDDATA;
yading@10 615 }
yading@10 616 floor_setup->data.t0.amplitude_bits = get_bits(gb, 6);
yading@10 617 floor_setup->data.t0.amplitude_offset = get_bits(gb, 8);
yading@10 618 floor_setup->data.t0.num_books = get_bits(gb, 4) + 1;
yading@10 619
yading@10 620 /* allocate mem for booklist */
yading@10 621 floor_setup->data.t0.book_list =
yading@10 622 av_malloc(floor_setup->data.t0.num_books);
yading@10 623 if (!floor_setup->data.t0.book_list)
yading@10 624 return AVERROR(ENOMEM);
yading@10 625 /* read book indexes */
yading@10 626 {
yading@10 627 int idx;
yading@10 628 unsigned book_idx;
yading@10 629 for (idx = 0; idx < floor_setup->data.t0.num_books; ++idx) {
yading@10 630 GET_VALIDATED_INDEX(book_idx, 8, vc->codebook_count)
yading@10 631 floor_setup->data.t0.book_list[idx] = book_idx;
yading@10 632 if (vc->codebooks[book_idx].dimensions > max_codebook_dim)
yading@10 633 max_codebook_dim = vc->codebooks[book_idx].dimensions;
yading@10 634 }
yading@10 635 }
yading@10 636
yading@10 637 if ((ret = create_map(vc, i)) < 0)
yading@10 638 return ret;
yading@10 639
yading@10 640 /* codebook dim is for padding if codebook dim doesn't *
yading@10 641 * divide order+1 then we need to read more data */
yading@10 642 floor_setup->data.t0.lsp =
yading@10 643 av_malloc((floor_setup->data.t0.order + 1 + max_codebook_dim)
yading@10 644 * sizeof(*floor_setup->data.t0.lsp));
yading@10 645 if (!floor_setup->data.t0.lsp)
yading@10 646 return AVERROR(ENOMEM);
yading@10 647
yading@10 648 /* debug output parsed headers */
yading@10 649 av_dlog(NULL, "floor0 order: %u\n", floor_setup->data.t0.order);
yading@10 650 av_dlog(NULL, "floor0 rate: %u\n", floor_setup->data.t0.rate);
yading@10 651 av_dlog(NULL, "floor0 bark map size: %u\n",
yading@10 652 floor_setup->data.t0.bark_map_size);
yading@10 653 av_dlog(NULL, "floor0 amplitude bits: %u\n",
yading@10 654 floor_setup->data.t0.amplitude_bits);
yading@10 655 av_dlog(NULL, "floor0 amplitude offset: %u\n",
yading@10 656 floor_setup->data.t0.amplitude_offset);
yading@10 657 av_dlog(NULL, "floor0 number of books: %u\n",
yading@10 658 floor_setup->data.t0.num_books);
yading@10 659 av_dlog(NULL, "floor0 book list pointer: %p\n",
yading@10 660 floor_setup->data.t0.book_list);
yading@10 661 {
yading@10 662 int idx;
yading@10 663 for (idx = 0; idx < floor_setup->data.t0.num_books; ++idx) {
yading@10 664 av_dlog(NULL, " Book %d: %u\n", idx + 1,
yading@10 665 floor_setup->data.t0.book_list[idx]);
yading@10 666 }
yading@10 667 }
yading@10 668 } else {
yading@10 669 av_log(vc->avctx, AV_LOG_ERROR, "Invalid floor type!\n");
yading@10 670 return AVERROR_INVALIDDATA;
yading@10 671 }
yading@10 672 }
yading@10 673 return 0;
yading@10 674 }
yading@10 675
yading@10 676 // Process residues part
yading@10 677
yading@10 678 static int vorbis_parse_setup_hdr_residues(vorbis_context *vc)
yading@10 679 {
yading@10 680 GetBitContext *gb = &vc->gb;
yading@10 681 unsigned i, j, k;
yading@10 682
yading@10 683 vc->residue_count = get_bits(gb, 6)+1;
yading@10 684 vc->residues = av_mallocz(vc->residue_count * sizeof(*vc->residues));
yading@10 685 if (!vc->residues)
yading@10 686 return AVERROR(ENOMEM);
yading@10 687
yading@10 688 av_dlog(NULL, " There are %d residues. \n", vc->residue_count);
yading@10 689
yading@10 690 for (i = 0; i < vc->residue_count; ++i) {
yading@10 691 vorbis_residue *res_setup = &vc->residues[i];
yading@10 692 uint8_t cascade[64];
yading@10 693 unsigned high_bits, low_bits;
yading@10 694
yading@10 695 res_setup->type = get_bits(gb, 16);
yading@10 696
yading@10 697 av_dlog(NULL, " %u. residue type %d\n", i, res_setup->type);
yading@10 698
yading@10 699 res_setup->begin = get_bits(gb, 24);
yading@10 700 res_setup->end = get_bits(gb, 24);
yading@10 701 res_setup->partition_size = get_bits(gb, 24) + 1;
yading@10 702 /* Validations to prevent a buffer overflow later. */
yading@10 703 if (res_setup->begin>res_setup->end ||
yading@10 704 res_setup->end > (res_setup->type == 2 ? vc->audio_channels : 1) * vc->blocksize[1] / 2 ||
yading@10 705 (res_setup->end-res_setup->begin) / res_setup->partition_size > V_MAX_PARTITIONS) {
yading@10 706 av_log(vc->avctx, AV_LOG_ERROR,
yading@10 707 "partition out of bounds: type, begin, end, size, blocksize: %"PRIu16", %"PRIu32", %"PRIu32", %u, %"PRIu32"\n",
yading@10 708 res_setup->type, res_setup->begin, res_setup->end,
yading@10 709 res_setup->partition_size, vc->blocksize[1] / 2);
yading@10 710 return AVERROR_INVALIDDATA;
yading@10 711 }
yading@10 712
yading@10 713 res_setup->classifications = get_bits(gb, 6) + 1;
yading@10 714 GET_VALIDATED_INDEX(res_setup->classbook, 8, vc->codebook_count)
yading@10 715
yading@10 716 res_setup->ptns_to_read =
yading@10 717 (res_setup->end - res_setup->begin) / res_setup->partition_size;
yading@10 718 res_setup->classifs = av_malloc(res_setup->ptns_to_read *
yading@10 719 vc->audio_channels *
yading@10 720 sizeof(*res_setup->classifs));
yading@10 721 if (!res_setup->classifs)
yading@10 722 return AVERROR(ENOMEM);
yading@10 723
yading@10 724 av_dlog(NULL, " begin %d end %d part.size %d classif.s %d classbook %d \n",
yading@10 725 res_setup->begin, res_setup->end, res_setup->partition_size,
yading@10 726 res_setup->classifications, res_setup->classbook);
yading@10 727
yading@10 728 for (j = 0; j < res_setup->classifications; ++j) {
yading@10 729 high_bits = 0;
yading@10 730 low_bits = get_bits(gb, 3);
yading@10 731 if (get_bits1(gb))
yading@10 732 high_bits = get_bits(gb, 5);
yading@10 733 cascade[j] = (high_bits << 3) + low_bits;
yading@10 734
yading@10 735 av_dlog(NULL, " %u class cascade depth: %d\n", j, ilog(cascade[j]));
yading@10 736 }
yading@10 737
yading@10 738 res_setup->maxpass = 0;
yading@10 739 for (j = 0; j < res_setup->classifications; ++j) {
yading@10 740 for (k = 0; k < 8; ++k) {
yading@10 741 if (cascade[j]&(1 << k)) {
yading@10 742 GET_VALIDATED_INDEX(res_setup->books[j][k], 8, vc->codebook_count)
yading@10 743
yading@10 744 av_dlog(NULL, " %u class cascade depth %u book: %d\n",
yading@10 745 j, k, res_setup->books[j][k]);
yading@10 746
yading@10 747 if (k>res_setup->maxpass)
yading@10 748 res_setup->maxpass = k;
yading@10 749 } else {
yading@10 750 res_setup->books[j][k] = -1;
yading@10 751 }
yading@10 752 }
yading@10 753 }
yading@10 754 }
yading@10 755 return 0;
yading@10 756 }
yading@10 757
yading@10 758 // Process mappings part
yading@10 759
yading@10 760 static int vorbis_parse_setup_hdr_mappings(vorbis_context *vc)
yading@10 761 {
yading@10 762 GetBitContext *gb = &vc->gb;
yading@10 763 unsigned i, j;
yading@10 764
yading@10 765 vc->mapping_count = get_bits(gb, 6)+1;
yading@10 766 vc->mappings = av_mallocz(vc->mapping_count * sizeof(*vc->mappings));
yading@10 767 if (!vc->mappings)
yading@10 768 return AVERROR(ENOMEM);
yading@10 769
yading@10 770 av_dlog(NULL, " There are %d mappings. \n", vc->mapping_count);
yading@10 771
yading@10 772 for (i = 0; i < vc->mapping_count; ++i) {
yading@10 773 vorbis_mapping *mapping_setup = &vc->mappings[i];
yading@10 774
yading@10 775 if (get_bits(gb, 16)) {
yading@10 776 av_log(vc->avctx, AV_LOG_ERROR, "Other mappings than type 0 are not compliant with the Vorbis I specification. \n");
yading@10 777 return AVERROR_INVALIDDATA;
yading@10 778 }
yading@10 779 if (get_bits1(gb)) {
yading@10 780 mapping_setup->submaps = get_bits(gb, 4) + 1;
yading@10 781 } else {
yading@10 782 mapping_setup->submaps = 1;
yading@10 783 }
yading@10 784
yading@10 785 if (get_bits1(gb)) {
yading@10 786 mapping_setup->coupling_steps = get_bits(gb, 8) + 1;
yading@10 787 mapping_setup->magnitude = av_mallocz(mapping_setup->coupling_steps *
yading@10 788 sizeof(*mapping_setup->magnitude));
yading@10 789 mapping_setup->angle = av_mallocz(mapping_setup->coupling_steps *
yading@10 790 sizeof(*mapping_setup->angle));
yading@10 791 if (!mapping_setup->angle || !mapping_setup->magnitude)
yading@10 792 return AVERROR(ENOMEM);
yading@10 793
yading@10 794 for (j = 0; j < mapping_setup->coupling_steps; ++j) {
yading@10 795 GET_VALIDATED_INDEX(mapping_setup->magnitude[j], ilog(vc->audio_channels - 1), vc->audio_channels)
yading@10 796 GET_VALIDATED_INDEX(mapping_setup->angle[j], ilog(vc->audio_channels - 1), vc->audio_channels)
yading@10 797 }
yading@10 798 } else {
yading@10 799 mapping_setup->coupling_steps = 0;
yading@10 800 }
yading@10 801
yading@10 802 av_dlog(NULL, " %u mapping coupling steps: %d\n",
yading@10 803 i, mapping_setup->coupling_steps);
yading@10 804
yading@10 805 if (get_bits(gb, 2)) {
yading@10 806 av_log(vc->avctx, AV_LOG_ERROR, "%u. mapping setup data invalid.\n", i);
yading@10 807 return AVERROR_INVALIDDATA; // following spec.
yading@10 808 }
yading@10 809
yading@10 810 if (mapping_setup->submaps>1) {
yading@10 811 mapping_setup->mux = av_mallocz(vc->audio_channels *
yading@10 812 sizeof(*mapping_setup->mux));
yading@10 813 if (!mapping_setup->mux)
yading@10 814 return AVERROR(ENOMEM);
yading@10 815
yading@10 816 for (j = 0; j < vc->audio_channels; ++j)
yading@10 817 mapping_setup->mux[j] = get_bits(gb, 4);
yading@10 818 }
yading@10 819
yading@10 820 for (j = 0; j < mapping_setup->submaps; ++j) {
yading@10 821 skip_bits(gb, 8); // FIXME check?
yading@10 822 GET_VALIDATED_INDEX(mapping_setup->submap_floor[j], 8, vc->floor_count)
yading@10 823 GET_VALIDATED_INDEX(mapping_setup->submap_residue[j], 8, vc->residue_count)
yading@10 824
yading@10 825 av_dlog(NULL, " %u mapping %u submap : floor %d, residue %d\n", i, j,
yading@10 826 mapping_setup->submap_floor[j],
yading@10 827 mapping_setup->submap_residue[j]);
yading@10 828 }
yading@10 829 }
yading@10 830 return 0;
yading@10 831 }
yading@10 832
yading@10 833 // Process modes part
yading@10 834
yading@10 835 static int create_map(vorbis_context *vc, unsigned floor_number)
yading@10 836 {
yading@10 837 vorbis_floor *floors = vc->floors;
yading@10 838 vorbis_floor0 *vf;
yading@10 839 int idx;
yading@10 840 int blockflag, n;
yading@10 841 int32_t *map;
yading@10 842
yading@10 843 for (blockflag = 0; blockflag < 2; ++blockflag) {
yading@10 844 n = vc->blocksize[blockflag] / 2;
yading@10 845 floors[floor_number].data.t0.map[blockflag] =
yading@10 846 av_malloc((n + 1) * sizeof(int32_t)); // n + sentinel
yading@10 847 if (!floors[floor_number].data.t0.map[blockflag])
yading@10 848 return AVERROR(ENOMEM);
yading@10 849
yading@10 850 map = floors[floor_number].data.t0.map[blockflag];
yading@10 851 vf = &floors[floor_number].data.t0;
yading@10 852
yading@10 853 for (idx = 0; idx < n; ++idx) {
yading@10 854 map[idx] = floor(BARK((vf->rate * idx) / (2.0f * n)) *
yading@10 855 (vf->bark_map_size / BARK(vf->rate / 2.0f)));
yading@10 856 if (vf->bark_map_size-1 < map[idx])
yading@10 857 map[idx] = vf->bark_map_size - 1;
yading@10 858 }
yading@10 859 map[n] = -1;
yading@10 860 vf->map_size[blockflag] = n;
yading@10 861 }
yading@10 862
yading@10 863 for (idx = 0; idx <= n; ++idx) {
yading@10 864 av_dlog(NULL, "floor0 map: map at pos %d is %d\n", idx, map[idx]);
yading@10 865 }
yading@10 866
yading@10 867 return 0;
yading@10 868 }
yading@10 869
yading@10 870 static int vorbis_parse_setup_hdr_modes(vorbis_context *vc)
yading@10 871 {
yading@10 872 GetBitContext *gb = &vc->gb;
yading@10 873 unsigned i;
yading@10 874
yading@10 875 vc->mode_count = get_bits(gb, 6) + 1;
yading@10 876 vc->modes = av_mallocz(vc->mode_count * sizeof(*vc->modes));
yading@10 877 if (!vc->modes)
yading@10 878 return AVERROR(ENOMEM);
yading@10 879
yading@10 880 av_dlog(NULL, " There are %d modes.\n", vc->mode_count);
yading@10 881
yading@10 882 for (i = 0; i < vc->mode_count; ++i) {
yading@10 883 vorbis_mode *mode_setup = &vc->modes[i];
yading@10 884
yading@10 885 mode_setup->blockflag = get_bits1(gb);
yading@10 886 mode_setup->windowtype = get_bits(gb, 16); //FIXME check
yading@10 887 mode_setup->transformtype = get_bits(gb, 16); //FIXME check
yading@10 888 GET_VALIDATED_INDEX(mode_setup->mapping, 8, vc->mapping_count);
yading@10 889
yading@10 890 av_dlog(NULL, " %u mode: blockflag %d, windowtype %d, transformtype %d, mapping %d\n",
yading@10 891 i, mode_setup->blockflag, mode_setup->windowtype,
yading@10 892 mode_setup->transformtype, mode_setup->mapping);
yading@10 893 }
yading@10 894 return 0;
yading@10 895 }
yading@10 896
yading@10 897 // Process the whole setup header using the functions above
yading@10 898
yading@10 899 static int vorbis_parse_setup_hdr(vorbis_context *vc)
yading@10 900 {
yading@10 901 GetBitContext *gb = &vc->gb;
yading@10 902 int ret;
yading@10 903
yading@10 904 if ((get_bits(gb, 8) != 'v') || (get_bits(gb, 8) != 'o') ||
yading@10 905 (get_bits(gb, 8) != 'r') || (get_bits(gb, 8) != 'b') ||
yading@10 906 (get_bits(gb, 8) != 'i') || (get_bits(gb, 8) != 's')) {
yading@10 907 av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (no vorbis signature). \n");
yading@10 908 return AVERROR_INVALIDDATA;
yading@10 909 }
yading@10 910
yading@10 911 if ((ret = vorbis_parse_setup_hdr_codebooks(vc))) {
yading@10 912 av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (codebooks). \n");
yading@10 913 return ret;
yading@10 914 }
yading@10 915 if ((ret = vorbis_parse_setup_hdr_tdtransforms(vc))) {
yading@10 916 av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (time domain transforms). \n");
yading@10 917 return ret;
yading@10 918 }
yading@10 919 if ((ret = vorbis_parse_setup_hdr_floors(vc))) {
yading@10 920 av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (floors). \n");
yading@10 921 return ret;
yading@10 922 }
yading@10 923 if ((ret = vorbis_parse_setup_hdr_residues(vc))) {
yading@10 924 av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (residues). \n");
yading@10 925 return ret;
yading@10 926 }
yading@10 927 if ((ret = vorbis_parse_setup_hdr_mappings(vc))) {
yading@10 928 av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (mappings). \n");
yading@10 929 return ret;
yading@10 930 }
yading@10 931 if ((ret = vorbis_parse_setup_hdr_modes(vc))) {
yading@10 932 av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (modes). \n");
yading@10 933 return ret;
yading@10 934 }
yading@10 935 if (!get_bits1(gb)) {
yading@10 936 av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (framing flag). \n");
yading@10 937 return AVERROR_INVALIDDATA; // framing flag bit unset error
yading@10 938 }
yading@10 939
yading@10 940 return 0;
yading@10 941 }
yading@10 942
yading@10 943 // Process the identification header
yading@10 944
yading@10 945 static int vorbis_parse_id_hdr(vorbis_context *vc)
yading@10 946 {
yading@10 947 GetBitContext *gb = &vc->gb;
yading@10 948 unsigned bl0, bl1;
yading@10 949
yading@10 950 if ((get_bits(gb, 8) != 'v') || (get_bits(gb, 8) != 'o') ||
yading@10 951 (get_bits(gb, 8) != 'r') || (get_bits(gb, 8) != 'b') ||
yading@10 952 (get_bits(gb, 8) != 'i') || (get_bits(gb, 8) != 's')) {
yading@10 953 av_log(vc->avctx, AV_LOG_ERROR, " Vorbis id header packet corrupt (no vorbis signature). \n");
yading@10 954 return AVERROR_INVALIDDATA;
yading@10 955 }
yading@10 956
yading@10 957 vc->version = get_bits_long(gb, 32); //FIXME check 0
yading@10 958 vc->audio_channels = get_bits(gb, 8);
yading@10 959 if (vc->audio_channels <= 0) {
yading@10 960 av_log(vc->avctx, AV_LOG_ERROR, "Invalid number of channels\n");
yading@10 961 return AVERROR_INVALIDDATA;
yading@10 962 }
yading@10 963 vc->audio_samplerate = get_bits_long(gb, 32);
yading@10 964 if (vc->audio_samplerate <= 0) {
yading@10 965 av_log(vc->avctx, AV_LOG_ERROR, "Invalid samplerate\n");
yading@10 966 return AVERROR_INVALIDDATA;
yading@10 967 }
yading@10 968 vc->bitrate_maximum = get_bits_long(gb, 32);
yading@10 969 vc->bitrate_nominal = get_bits_long(gb, 32);
yading@10 970 vc->bitrate_minimum = get_bits_long(gb, 32);
yading@10 971 bl0 = get_bits(gb, 4);
yading@10 972 bl1 = get_bits(gb, 4);
yading@10 973 if (bl0 > 13 || bl0 < 6 || bl1 > 13 || bl1 < 6 || bl1 < bl0) {
yading@10 974 av_log(vc->avctx, AV_LOG_ERROR, " Vorbis id header packet corrupt (illegal blocksize). \n");
yading@10 975 return AVERROR_INVALIDDATA;
yading@10 976 }
yading@10 977 vc->blocksize[0] = (1 << bl0);
yading@10 978 vc->blocksize[1] = (1 << bl1);
yading@10 979 vc->win[0] = ff_vorbis_vwin[bl0 - 6];
yading@10 980 vc->win[1] = ff_vorbis_vwin[bl1 - 6];
yading@10 981
yading@10 982 if ((get_bits1(gb)) == 0) {
yading@10 983 av_log(vc->avctx, AV_LOG_ERROR, " Vorbis id header packet corrupt (framing flag not set). \n");
yading@10 984 return AVERROR_INVALIDDATA;
yading@10 985 }
yading@10 986
yading@10 987 vc->channel_residues = av_malloc((vc->blocksize[1] / 2) * vc->audio_channels * sizeof(*vc->channel_residues));
yading@10 988 vc->saved = av_mallocz((vc->blocksize[1] / 4) * vc->audio_channels * sizeof(*vc->saved));
yading@10 989 if (!vc->channel_residues || !vc->saved)
yading@10 990 return AVERROR(ENOMEM);
yading@10 991
yading@10 992 vc->previous_window = 0;
yading@10 993
yading@10 994 ff_mdct_init(&vc->mdct[0], bl0, 1, -1.0);
yading@10 995 ff_mdct_init(&vc->mdct[1], bl1, 1, -1.0);
yading@10 996
yading@10 997 av_dlog(NULL, " vorbis version %d \n audio_channels %d \n audio_samplerate %d \n bitrate_max %d \n bitrate_nom %d \n bitrate_min %d \n blk_0 %d blk_1 %d \n ",
yading@10 998 vc->version, vc->audio_channels, vc->audio_samplerate, vc->bitrate_maximum, vc->bitrate_nominal, vc->bitrate_minimum, vc->blocksize[0], vc->blocksize[1]);
yading@10 999
yading@10 1000 /*
yading@10 1001 BLK = vc->blocksize[0];
yading@10 1002 for (i = 0; i < BLK / 2; ++i) {
yading@10 1003 vc->win[0][i] = sin(0.5*3.14159265358*(sin(((float)i + 0.5) / (float)BLK*3.14159265358))*(sin(((float)i + 0.5) / (float)BLK*3.14159265358)));
yading@10 1004 }
yading@10 1005 */
yading@10 1006
yading@10 1007 return 0;
yading@10 1008 }
yading@10 1009
yading@10 1010 // Process the extradata using the functions above (identification header, setup header)
yading@10 1011
yading@10 1012 static av_cold int vorbis_decode_init(AVCodecContext *avctx)
yading@10 1013 {
yading@10 1014 vorbis_context *vc = avctx->priv_data;
yading@10 1015 uint8_t *headers = avctx->extradata;
yading@10 1016 int headers_len = avctx->extradata_size;
yading@10 1017 uint8_t *header_start[3];
yading@10 1018 int header_len[3];
yading@10 1019 GetBitContext *gb = &vc->gb;
yading@10 1020 int hdr_type, ret;
yading@10 1021
yading@10 1022 vc->avctx = avctx;
yading@10 1023 ff_vorbisdsp_init(&vc->dsp);
yading@10 1024 avpriv_float_dsp_init(&vc->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
yading@10 1025 ff_fmt_convert_init(&vc->fmt_conv, avctx);
yading@10 1026
yading@10 1027 avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
yading@10 1028
yading@10 1029 if (!headers_len) {
yading@10 1030 av_log(avctx, AV_LOG_ERROR, "Extradata missing.\n");
yading@10 1031 return AVERROR_INVALIDDATA;
yading@10 1032 }
yading@10 1033
yading@10 1034 if ((ret = avpriv_split_xiph_headers(headers, headers_len, 30, header_start, header_len)) < 0) {
yading@10 1035 av_log(avctx, AV_LOG_ERROR, "Extradata corrupt.\n");
yading@10 1036 return ret;
yading@10 1037 }
yading@10 1038
yading@10 1039 init_get_bits(gb, header_start[0], header_len[0]*8);
yading@10 1040 hdr_type = get_bits(gb, 8);
yading@10 1041 if (hdr_type != 1) {
yading@10 1042 av_log(avctx, AV_LOG_ERROR, "First header is not the id header.\n");
yading@10 1043 return AVERROR_INVALIDDATA;
yading@10 1044 }
yading@10 1045 if ((ret = vorbis_parse_id_hdr(vc))) {
yading@10 1046 av_log(avctx, AV_LOG_ERROR, "Id header corrupt.\n");
yading@10 1047 vorbis_free(vc);
yading@10 1048 return ret;
yading@10 1049 }
yading@10 1050
yading@10 1051 init_get_bits(gb, header_start[2], header_len[2]*8);
yading@10 1052 hdr_type = get_bits(gb, 8);
yading@10 1053 if (hdr_type != 5) {
yading@10 1054 av_log(avctx, AV_LOG_ERROR, "Third header is not the setup header.\n");
yading@10 1055 vorbis_free(vc);
yading@10 1056 return AVERROR_INVALIDDATA;
yading@10 1057 }
yading@10 1058 if ((ret = vorbis_parse_setup_hdr(vc))) {
yading@10 1059 av_log(avctx, AV_LOG_ERROR, "Setup header corrupt.\n");
yading@10 1060 vorbis_free(vc);
yading@10 1061 return ret;
yading@10 1062 }
yading@10 1063
yading@10 1064 if (vc->audio_channels > 8)
yading@10 1065 avctx->channel_layout = 0;
yading@10 1066 else
yading@10 1067 avctx->channel_layout = ff_vorbis_channel_layouts[vc->audio_channels - 1];
yading@10 1068
yading@10 1069 avctx->channels = vc->audio_channels;
yading@10 1070 avctx->sample_rate = vc->audio_samplerate;
yading@10 1071
yading@10 1072 return 0;
yading@10 1073 }
yading@10 1074
yading@10 1075 // Decode audiopackets -------------------------------------------------
yading@10 1076
yading@10 1077 // Read and decode floor
yading@10 1078
yading@10 1079 static int vorbis_floor0_decode(vorbis_context *vc,
yading@10 1080 vorbis_floor_data *vfu, float *vec)
yading@10 1081 {
yading@10 1082 vorbis_floor0 *vf = &vfu->t0;
yading@10 1083 float *lsp = vf->lsp;
yading@10 1084 unsigned amplitude, book_idx;
yading@10 1085 unsigned blockflag = vc->modes[vc->mode_number].blockflag;
yading@10 1086
yading@10 1087 if (!vf->amplitude_bits)
yading@10 1088 return 1;
yading@10 1089
yading@10 1090 amplitude = get_bits(&vc->gb, vf->amplitude_bits);
yading@10 1091 if (amplitude > 0) {
yading@10 1092 float last = 0;
yading@10 1093 unsigned idx, lsp_len = 0;
yading@10 1094 vorbis_codebook codebook;
yading@10 1095
yading@10 1096 book_idx = get_bits(&vc->gb, ilog(vf->num_books));
yading@10 1097 if (book_idx >= vf->num_books) {
yading@10 1098 av_log(vc->avctx, AV_LOG_ERROR, "floor0 dec: booknumber too high!\n");
yading@10 1099 book_idx = 0;
yading@10 1100 }
yading@10 1101 av_dlog(NULL, "floor0 dec: booknumber: %u\n", book_idx);
yading@10 1102 codebook = vc->codebooks[vf->book_list[book_idx]];
yading@10 1103 /* Invalid codebook! */
yading@10 1104 if (!codebook.codevectors)
yading@10 1105 return AVERROR_INVALIDDATA;
yading@10 1106
yading@10 1107 while (lsp_len<vf->order) {
yading@10 1108 int vec_off;
yading@10 1109
yading@10 1110 av_dlog(NULL, "floor0 dec: book dimension: %d\n", codebook.dimensions);
yading@10 1111 av_dlog(NULL, "floor0 dec: maximum depth: %d\n", codebook.maxdepth);
yading@10 1112 /* read temp vector */
yading@10 1113 vec_off = get_vlc2(&vc->gb, codebook.vlc.table,
yading@10 1114 codebook.nb_bits, codebook.maxdepth)
yading@10 1115 * codebook.dimensions;
yading@10 1116 av_dlog(NULL, "floor0 dec: vector offset: %d\n", vec_off);
yading@10 1117 /* copy each vector component and add last to it */
yading@10 1118 for (idx = 0; idx < codebook.dimensions; ++idx)
yading@10 1119 lsp[lsp_len+idx] = codebook.codevectors[vec_off+idx] + last;
yading@10 1120 last = lsp[lsp_len+idx-1]; /* set last to last vector component */
yading@10 1121
yading@10 1122 lsp_len += codebook.dimensions;
yading@10 1123 }
yading@10 1124 /* DEBUG: output lsp coeffs */
yading@10 1125 {
yading@10 1126 int idx;
yading@10 1127 for (idx = 0; idx < lsp_len; ++idx)
yading@10 1128 av_dlog(NULL, "floor0 dec: coeff at %d is %f\n", idx, lsp[idx]);
yading@10 1129 }
yading@10 1130
yading@10 1131 /* synthesize floor output vector */
yading@10 1132 {
yading@10 1133 int i;
yading@10 1134 int order = vf->order;
yading@10 1135 float wstep = M_PI / vf->bark_map_size;
yading@10 1136
yading@10 1137 for (i = 0; i < order; i++)
yading@10 1138 lsp[i] = 2.0f * cos(lsp[i]);
yading@10 1139
yading@10 1140 av_dlog(NULL, "floor0 synth: map_size = %"PRIu32"; m = %d; wstep = %f\n",
yading@10 1141 vf->map_size[blockflag], order, wstep);
yading@10 1142
yading@10 1143 i = 0;
yading@10 1144 while (i < vf->map_size[blockflag]) {
yading@10 1145 int j, iter_cond = vf->map[blockflag][i];
yading@10 1146 float p = 0.5f;
yading@10 1147 float q = 0.5f;
yading@10 1148 float two_cos_w = 2.0f * cos(wstep * iter_cond); // needed all times
yading@10 1149
yading@10 1150 /* similar part for the q and p products */
yading@10 1151 for (j = 0; j + 1 < order; j += 2) {
yading@10 1152 q *= lsp[j] - two_cos_w;
yading@10 1153 p *= lsp[j + 1] - two_cos_w;
yading@10 1154 }
yading@10 1155 if (j == order) { // even order
yading@10 1156 p *= p * (2.0f - two_cos_w);
yading@10 1157 q *= q * (2.0f + two_cos_w);
yading@10 1158 } else { // odd order
yading@10 1159 q *= two_cos_w-lsp[j]; // one more time for q
yading@10 1160
yading@10 1161 /* final step and square */
yading@10 1162 p *= p * (4.f - two_cos_w * two_cos_w);
yading@10 1163 q *= q;
yading@10 1164 }
yading@10 1165
yading@10 1166 /* calculate linear floor value */
yading@10 1167 q = exp((((amplitude*vf->amplitude_offset) /
yading@10 1168 (((1 << vf->amplitude_bits) - 1) * sqrt(p + q)))
yading@10 1169 - vf->amplitude_offset) * .11512925f);
yading@10 1170
yading@10 1171 /* fill vector */
yading@10 1172 do {
yading@10 1173 vec[i] = q; ++i;
yading@10 1174 } while (vf->map[blockflag][i] == iter_cond);
yading@10 1175 }
yading@10 1176 }
yading@10 1177 } else {
yading@10 1178 /* this channel is unused */
yading@10 1179 return 1;
yading@10 1180 }
yading@10 1181
yading@10 1182 av_dlog(NULL, " Floor0 decoded\n");
yading@10 1183
yading@10 1184 return 0;
yading@10 1185 }
yading@10 1186
yading@10 1187 static int vorbis_floor1_decode(vorbis_context *vc,
yading@10 1188 vorbis_floor_data *vfu, float *vec)
yading@10 1189 {
yading@10 1190 vorbis_floor1 *vf = &vfu->t1;
yading@10 1191 GetBitContext *gb = &vc->gb;
yading@10 1192 uint16_t range_v[4] = { 256, 128, 86, 64 };
yading@10 1193 unsigned range = range_v[vf->multiplier - 1];
yading@10 1194 uint16_t floor1_Y[258];
yading@10 1195 uint16_t floor1_Y_final[258];
yading@10 1196 int floor1_flag[258];
yading@10 1197 unsigned partition_class, cdim, cbits, csub, cval, offset, i, j;
yading@10 1198 int book, adx, ady, dy, off, predicted, err;
yading@10 1199
yading@10 1200
yading@10 1201 if (!get_bits1(gb)) // silence
yading@10 1202 return 1;
yading@10 1203
yading@10 1204 // Read values (or differences) for the floor's points
yading@10 1205
yading@10 1206 floor1_Y[0] = get_bits(gb, ilog(range - 1));
yading@10 1207 floor1_Y[1] = get_bits(gb, ilog(range - 1));
yading@10 1208
yading@10 1209 av_dlog(NULL, "floor 0 Y %d floor 1 Y %d \n", floor1_Y[0], floor1_Y[1]);
yading@10 1210
yading@10 1211 offset = 2;
yading@10 1212 for (i = 0; i < vf->partitions; ++i) {
yading@10 1213 partition_class = vf->partition_class[i];
yading@10 1214 cdim = vf->class_dimensions[partition_class];
yading@10 1215 cbits = vf->class_subclasses[partition_class];
yading@10 1216 csub = (1 << cbits) - 1;
yading@10 1217 cval = 0;
yading@10 1218
yading@10 1219 av_dlog(NULL, "Cbits %u\n", cbits);
yading@10 1220
yading@10 1221 if (cbits) // this reads all subclasses for this partition's class
yading@10 1222 cval = get_vlc2(gb, vc->codebooks[vf->class_masterbook[partition_class]].vlc.table,
yading@10 1223 vc->codebooks[vf->class_masterbook[partition_class]].nb_bits, 3);
yading@10 1224
yading@10 1225 for (j = 0; j < cdim; ++j) {
yading@10 1226 book = vf->subclass_books[partition_class][cval & csub];
yading@10 1227
yading@10 1228 av_dlog(NULL, "book %d Cbits %u cval %u bits:%d\n",
yading@10 1229 book, cbits, cval, get_bits_count(gb));
yading@10 1230
yading@10 1231 cval = cval >> cbits;
yading@10 1232 if (book > -1) {
yading@10 1233 floor1_Y[offset+j] = get_vlc2(gb, vc->codebooks[book].vlc.table,
yading@10 1234 vc->codebooks[book].nb_bits, 3);
yading@10 1235 } else {
yading@10 1236 floor1_Y[offset+j] = 0;
yading@10 1237 }
yading@10 1238
yading@10 1239 av_dlog(NULL, " floor(%d) = %d \n",
yading@10 1240 vf->list[offset+j].x, floor1_Y[offset+j]);
yading@10 1241 }
yading@10 1242 offset+=cdim;
yading@10 1243 }
yading@10 1244
yading@10 1245 // Amplitude calculation from the differences
yading@10 1246
yading@10 1247 floor1_flag[0] = 1;
yading@10 1248 floor1_flag[1] = 1;
yading@10 1249 floor1_Y_final[0] = floor1_Y[0];
yading@10 1250 floor1_Y_final[1] = floor1_Y[1];
yading@10 1251
yading@10 1252 for (i = 2; i < vf->x_list_dim; ++i) {
yading@10 1253 unsigned val, highroom, lowroom, room, high_neigh_offs, low_neigh_offs;
yading@10 1254
yading@10 1255 low_neigh_offs = vf->list[i].low;
yading@10 1256 high_neigh_offs = vf->list[i].high;
yading@10 1257 dy = floor1_Y_final[high_neigh_offs] - floor1_Y_final[low_neigh_offs]; // render_point begin
yading@10 1258 adx = vf->list[high_neigh_offs].x - vf->list[low_neigh_offs].x;
yading@10 1259 ady = FFABS(dy);
yading@10 1260 err = ady * (vf->list[i].x - vf->list[low_neigh_offs].x);
yading@10 1261 off = err / adx;
yading@10 1262 if (dy < 0) {
yading@10 1263 predicted = floor1_Y_final[low_neigh_offs] - off;
yading@10 1264 } else {
yading@10 1265 predicted = floor1_Y_final[low_neigh_offs] + off;
yading@10 1266 } // render_point end
yading@10 1267
yading@10 1268 val = floor1_Y[i];
yading@10 1269 highroom = range-predicted;
yading@10 1270 lowroom = predicted;
yading@10 1271 if (highroom < lowroom) {
yading@10 1272 room = highroom * 2;
yading@10 1273 } else {
yading@10 1274 room = lowroom * 2; // SPEC misspelling
yading@10 1275 }
yading@10 1276 if (val) {
yading@10 1277 floor1_flag[low_neigh_offs] = 1;
yading@10 1278 floor1_flag[high_neigh_offs] = 1;
yading@10 1279 floor1_flag[i] = 1;
yading@10 1280 if (val >= room) {
yading@10 1281 if (highroom > lowroom) {
yading@10 1282 floor1_Y_final[i] = av_clip_uint16(val - lowroom + predicted);
yading@10 1283 } else {
yading@10 1284 floor1_Y_final[i] = av_clip_uint16(predicted - val + highroom - 1);
yading@10 1285 }
yading@10 1286 } else {
yading@10 1287 if (val & 1) {
yading@10 1288 floor1_Y_final[i] = av_clip_uint16(predicted - (val + 1) / 2);
yading@10 1289 } else {
yading@10 1290 floor1_Y_final[i] = av_clip_uint16(predicted + val / 2);
yading@10 1291 }
yading@10 1292 }
yading@10 1293 } else {
yading@10 1294 floor1_flag[i] = 0;
yading@10 1295 floor1_Y_final[i] = av_clip_uint16(predicted);
yading@10 1296 }
yading@10 1297
yading@10 1298 av_dlog(NULL, " Decoded floor(%d) = %u / val %u\n",
yading@10 1299 vf->list[i].x, floor1_Y_final[i], val);
yading@10 1300 }
yading@10 1301
yading@10 1302 // Curve synth - connect the calculated dots and convert from dB scale FIXME optimize ?
yading@10 1303
yading@10 1304 ff_vorbis_floor1_render_list(vf->list, vf->x_list_dim, floor1_Y_final, floor1_flag, vf->multiplier, vec, vf->list[1].x);
yading@10 1305
yading@10 1306 av_dlog(NULL, " Floor decoded\n");
yading@10 1307
yading@10 1308 return 0;
yading@10 1309 }
yading@10 1310
yading@10 1311 // Read and decode residue
yading@10 1312
yading@10 1313 static av_always_inline int vorbis_residue_decode_internal(vorbis_context *vc,
yading@10 1314 vorbis_residue *vr,
yading@10 1315 unsigned ch,
yading@10 1316 uint8_t *do_not_decode,
yading@10 1317 float *vec,
yading@10 1318 unsigned vlen,
yading@10 1319 unsigned ch_left,
yading@10 1320 int vr_type)
yading@10 1321 {
yading@10 1322 GetBitContext *gb = &vc->gb;
yading@10 1323 unsigned c_p_c = vc->codebooks[vr->classbook].dimensions;
yading@10 1324 unsigned ptns_to_read = vr->ptns_to_read;
yading@10 1325 uint8_t *classifs = vr->classifs;
yading@10 1326 unsigned pass, ch_used, i, j, k, l;
yading@10 1327 unsigned max_output = (ch - 1) * vlen;
yading@10 1328
yading@10 1329 if (vr_type == 2) {
yading@10 1330 for (j = 1; j < ch; ++j)
yading@10 1331 do_not_decode[0] &= do_not_decode[j]; // FIXME - clobbering input
yading@10 1332 if (do_not_decode[0])
yading@10 1333 return 0;
yading@10 1334 ch_used = 1;
yading@10 1335 max_output += vr->end / ch;
yading@10 1336 } else {
yading@10 1337 ch_used = ch;
yading@10 1338 max_output += vr->end;
yading@10 1339 }
yading@10 1340
yading@10 1341 if (max_output > ch_left * vlen) {
yading@10 1342 av_log(vc->avctx, AV_LOG_ERROR, "Insufficient output buffer\n");
yading@10 1343 return -1;
yading@10 1344 }
yading@10 1345
yading@10 1346 av_dlog(NULL, " residue type 0/1/2 decode begin, ch: %d cpc %d \n", ch, c_p_c);
yading@10 1347
yading@10 1348 for (pass = 0; pass <= vr->maxpass; ++pass) { // FIXME OPTIMIZE?
yading@10 1349 uint16_t voffset, partition_count, j_times_ptns_to_read;
yading@10 1350
yading@10 1351 voffset = vr->begin;
yading@10 1352 for (partition_count = 0; partition_count < ptns_to_read;) { // SPEC error
yading@10 1353 if (!pass) {
yading@10 1354 unsigned inverse_class = ff_inverse[vr->classifications];
yading@10 1355 for (j_times_ptns_to_read = 0, j = 0; j < ch_used; ++j) {
yading@10 1356 if (!do_not_decode[j]) {
yading@10 1357 unsigned temp = get_vlc2(gb, vc->codebooks[vr->classbook].vlc.table,
yading@10 1358 vc->codebooks[vr->classbook].nb_bits, 3);
yading@10 1359
yading@10 1360 av_dlog(NULL, "Classword: %u\n", temp);
yading@10 1361
yading@10 1362 av_assert0(vr->classifications > 1 && temp <= 65536); //needed for inverse[]
yading@10 1363 for (i = 0; i < c_p_c; ++i) {
yading@10 1364 unsigned temp2;
yading@10 1365
yading@10 1366 temp2 = (((uint64_t)temp) * inverse_class) >> 32;
yading@10 1367 if (partition_count + c_p_c - 1 - i < ptns_to_read)
yading@10 1368 classifs[j_times_ptns_to_read + partition_count + c_p_c - 1 - i] = temp - temp2 * vr->classifications;
yading@10 1369 temp = temp2;
yading@10 1370 }
yading@10 1371 }
yading@10 1372 j_times_ptns_to_read += ptns_to_read;
yading@10 1373 }
yading@10 1374 }
yading@10 1375 for (i = 0; (i < c_p_c) && (partition_count < ptns_to_read); ++i) {
yading@10 1376 for (j_times_ptns_to_read = 0, j = 0; j < ch_used; ++j) {
yading@10 1377 unsigned voffs;
yading@10 1378
yading@10 1379 if (!do_not_decode[j]) {
yading@10 1380 unsigned vqclass = classifs[j_times_ptns_to_read + partition_count];
yading@10 1381 int vqbook = vr->books[vqclass][pass];
yading@10 1382
yading@10 1383 if (vqbook >= 0 && vc->codebooks[vqbook].codevectors) {
yading@10 1384 unsigned coffs;
yading@10 1385 unsigned dim = vc->codebooks[vqbook].dimensions;
yading@10 1386 unsigned step = FASTDIV(vr->partition_size << 1, dim << 1);
yading@10 1387 vorbis_codebook codebook = vc->codebooks[vqbook];
yading@10 1388
yading@10 1389 if (vr_type == 0) {
yading@10 1390
yading@10 1391 voffs = voffset+j*vlen;
yading@10 1392 for (k = 0; k < step; ++k) {
yading@10 1393 coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * dim;
yading@10 1394 for (l = 0; l < dim; ++l)
yading@10 1395 vec[voffs + k + l * step] += codebook.codevectors[coffs + l];
yading@10 1396 }
yading@10 1397 } else if (vr_type == 1) {
yading@10 1398 voffs = voffset + j * vlen;
yading@10 1399 for (k = 0; k < step; ++k) {
yading@10 1400 coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * dim;
yading@10 1401 for (l = 0; l < dim; ++l, ++voffs) {
yading@10 1402 vec[voffs]+=codebook.codevectors[coffs+l];
yading@10 1403
yading@10 1404 av_dlog(NULL, " pass %d offs: %d curr: %f change: %f cv offs.: %d \n",
yading@10 1405 pass, voffs, vec[voffs], codebook.codevectors[coffs+l], coffs);
yading@10 1406 }
yading@10 1407 }
yading@10 1408 } else if (vr_type == 2 && ch == 2 && (voffset & 1) == 0 && (dim & 1) == 0) { // most frequent case optimized
yading@10 1409 voffs = voffset >> 1;
yading@10 1410
yading@10 1411 if (dim == 2) {
yading@10 1412 for (k = 0; k < step; ++k) {
yading@10 1413 coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * 2;
yading@10 1414 vec[voffs + k ] += codebook.codevectors[coffs ];
yading@10 1415 vec[voffs + k + vlen] += codebook.codevectors[coffs + 1];
yading@10 1416 }
yading@10 1417 } else if (dim == 4) {
yading@10 1418 for (k = 0; k < step; ++k, voffs += 2) {
yading@10 1419 coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * 4;
yading@10 1420 vec[voffs ] += codebook.codevectors[coffs ];
yading@10 1421 vec[voffs + 1 ] += codebook.codevectors[coffs + 2];
yading@10 1422 vec[voffs + vlen ] += codebook.codevectors[coffs + 1];
yading@10 1423 vec[voffs + vlen + 1] += codebook.codevectors[coffs + 3];
yading@10 1424 }
yading@10 1425 } else
yading@10 1426 for (k = 0; k < step; ++k) {
yading@10 1427 coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * dim;
yading@10 1428 for (l = 0; l < dim; l += 2, voffs++) {
yading@10 1429 vec[voffs ] += codebook.codevectors[coffs + l ];
yading@10 1430 vec[voffs + vlen] += codebook.codevectors[coffs + l + 1];
yading@10 1431
yading@10 1432 av_dlog(NULL, " pass %d offs: %d curr: %f change: %f cv offs.: %d+%d \n",
yading@10 1433 pass, voffset / ch + (voffs % ch) * vlen,
yading@10 1434 vec[voffset / ch + (voffs % ch) * vlen],
yading@10 1435 codebook.codevectors[coffs + l], coffs, l);
yading@10 1436 }
yading@10 1437 }
yading@10 1438
yading@10 1439 } else if (vr_type == 2) {
yading@10 1440 unsigned voffs_div = FASTDIV(voffset << 1, ch <<1);
yading@10 1441 unsigned voffs_mod = voffset - voffs_div * ch;
yading@10 1442
yading@10 1443 for (k = 0; k < step; ++k) {
yading@10 1444 coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * dim;
yading@10 1445 for (l = 0; l < dim; ++l) {
yading@10 1446 vec[voffs_div + voffs_mod * vlen] +=
yading@10 1447 codebook.codevectors[coffs + l];
yading@10 1448
yading@10 1449 av_dlog(NULL, " pass %d offs: %d curr: %f change: %f cv offs.: %d+%d \n",
yading@10 1450 pass, voffs_div + voffs_mod * vlen,
yading@10 1451 vec[voffs_div + voffs_mod * vlen],
yading@10 1452 codebook.codevectors[coffs + l], coffs, l);
yading@10 1453
yading@10 1454 if (++voffs_mod == ch) {
yading@10 1455 voffs_div++;
yading@10 1456 voffs_mod = 0;
yading@10 1457 }
yading@10 1458 }
yading@10 1459 }
yading@10 1460 }
yading@10 1461 }
yading@10 1462 }
yading@10 1463 j_times_ptns_to_read += ptns_to_read;
yading@10 1464 }
yading@10 1465 ++partition_count;
yading@10 1466 voffset += vr->partition_size;
yading@10 1467 }
yading@10 1468 }
yading@10 1469 }
yading@10 1470 return 0;
yading@10 1471 }
yading@10 1472
yading@10 1473 static inline int vorbis_residue_decode(vorbis_context *vc, vorbis_residue *vr,
yading@10 1474 unsigned ch,
yading@10 1475 uint8_t *do_not_decode,
yading@10 1476 float *vec, unsigned vlen,
yading@10 1477 unsigned ch_left)
yading@10 1478 {
yading@10 1479 if (vr->type == 2)
yading@10 1480 return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, ch_left, 2);
yading@10 1481 else if (vr->type == 1)
yading@10 1482 return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, ch_left, 1);
yading@10 1483 else if (vr->type == 0)
yading@10 1484 return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, ch_left, 0);
yading@10 1485 else {
yading@10 1486 av_log(vc->avctx, AV_LOG_ERROR, " Invalid residue type while residue decode?! \n");
yading@10 1487 return AVERROR_INVALIDDATA;
yading@10 1488 }
yading@10 1489 }
yading@10 1490
yading@10 1491 void ff_vorbis_inverse_coupling(float *mag, float *ang, intptr_t blocksize)
yading@10 1492 {
yading@10 1493 int i;
yading@10 1494 for (i = 0; i < blocksize; i++) {
yading@10 1495 if (mag[i] > 0.0) {
yading@10 1496 if (ang[i] > 0.0) {
yading@10 1497 ang[i] = mag[i] - ang[i];
yading@10 1498 } else {
yading@10 1499 float temp = ang[i];
yading@10 1500 ang[i] = mag[i];
yading@10 1501 mag[i] += temp;
yading@10 1502 }
yading@10 1503 } else {
yading@10 1504 if (ang[i] > 0.0) {
yading@10 1505 ang[i] += mag[i];
yading@10 1506 } else {
yading@10 1507 float temp = ang[i];
yading@10 1508 ang[i] = mag[i];
yading@10 1509 mag[i] -= temp;
yading@10 1510 }
yading@10 1511 }
yading@10 1512 }
yading@10 1513 }
yading@10 1514
yading@10 1515 // Decode the audio packet using the functions above
yading@10 1516
yading@10 1517 static int vorbis_parse_audio_packet(vorbis_context *vc, float **floor_ptr)
yading@10 1518 {
yading@10 1519 GetBitContext *gb = &vc->gb;
yading@10 1520 FFTContext *mdct;
yading@10 1521 unsigned previous_window = vc->previous_window;
yading@10 1522 unsigned mode_number, blockflag, blocksize;
yading@10 1523 int i, j;
yading@10 1524 uint8_t no_residue[255];
yading@10 1525 uint8_t do_not_decode[255];
yading@10 1526 vorbis_mapping *mapping;
yading@10 1527 float *ch_res_ptr = vc->channel_residues;
yading@10 1528 uint8_t res_chan[255];
yading@10 1529 unsigned res_num = 0;
yading@10 1530 int retlen = 0;
yading@10 1531 unsigned ch_left = vc->audio_channels;
yading@10 1532 unsigned vlen;
yading@10 1533
yading@10 1534 if (get_bits1(gb)) {
yading@10 1535 av_log(vc->avctx, AV_LOG_ERROR, "Not a Vorbis I audio packet.\n");
yading@10 1536 return AVERROR_INVALIDDATA; // packet type not audio
yading@10 1537 }
yading@10 1538
yading@10 1539 if (vc->mode_count == 1) {
yading@10 1540 mode_number = 0;
yading@10 1541 } else {
yading@10 1542 GET_VALIDATED_INDEX(mode_number, ilog(vc->mode_count-1), vc->mode_count)
yading@10 1543 }
yading@10 1544 vc->mode_number = mode_number;
yading@10 1545 mapping = &vc->mappings[vc->modes[mode_number].mapping];
yading@10 1546
yading@10 1547 av_dlog(NULL, " Mode number: %u , mapping: %d , blocktype %d\n", mode_number,
yading@10 1548 vc->modes[mode_number].mapping, vc->modes[mode_number].blockflag);
yading@10 1549
yading@10 1550 blockflag = vc->modes[mode_number].blockflag;
yading@10 1551 blocksize = vc->blocksize[blockflag];
yading@10 1552 vlen = blocksize / 2;
yading@10 1553 if (blockflag) {
yading@10 1554 previous_window = get_bits(gb, 1);
yading@10 1555 skip_bits1(gb); // next_window
yading@10 1556 }
yading@10 1557
yading@10 1558 memset(ch_res_ptr, 0, sizeof(float) * vc->audio_channels * vlen); //FIXME can this be removed ?
yading@10 1559 for (i = 0; i < vc->audio_channels; ++i)
yading@10 1560 memset(floor_ptr[i], 0, vlen * sizeof(floor_ptr[0][0])); //FIXME can this be removed ?
yading@10 1561
yading@10 1562 // Decode floor
yading@10 1563
yading@10 1564 for (i = 0; i < vc->audio_channels; ++i) {
yading@10 1565 vorbis_floor *floor;
yading@10 1566 int ret;
yading@10 1567 if (mapping->submaps > 1) {
yading@10 1568 floor = &vc->floors[mapping->submap_floor[mapping->mux[i]]];
yading@10 1569 } else {
yading@10 1570 floor = &vc->floors[mapping->submap_floor[0]];
yading@10 1571 }
yading@10 1572
yading@10 1573 ret = floor->decode(vc, &floor->data, floor_ptr[i]);
yading@10 1574
yading@10 1575 if (ret < 0) {
yading@10 1576 av_log(vc->avctx, AV_LOG_ERROR, "Invalid codebook in vorbis_floor_decode.\n");
yading@10 1577 return AVERROR_INVALIDDATA;
yading@10 1578 }
yading@10 1579 no_residue[i] = ret;
yading@10 1580 }
yading@10 1581
yading@10 1582 // Nonzero vector propagate
yading@10 1583
yading@10 1584 for (i = mapping->coupling_steps - 1; i >= 0; --i) {
yading@10 1585 if (!(no_residue[mapping->magnitude[i]] & no_residue[mapping->angle[i]])) {
yading@10 1586 no_residue[mapping->magnitude[i]] = 0;
yading@10 1587 no_residue[mapping->angle[i]] = 0;
yading@10 1588 }
yading@10 1589 }
yading@10 1590
yading@10 1591 // Decode residue
yading@10 1592
yading@10 1593 for (i = 0; i < mapping->submaps; ++i) {
yading@10 1594 vorbis_residue *residue;
yading@10 1595 unsigned ch = 0;
yading@10 1596 int ret;
yading@10 1597
yading@10 1598 for (j = 0; j < vc->audio_channels; ++j) {
yading@10 1599 if ((mapping->submaps == 1) || (i == mapping->mux[j])) {
yading@10 1600 res_chan[j] = res_num;
yading@10 1601 if (no_residue[j]) {
yading@10 1602 do_not_decode[ch] = 1;
yading@10 1603 } else {
yading@10 1604 do_not_decode[ch] = 0;
yading@10 1605 }
yading@10 1606 ++ch;
yading@10 1607 ++res_num;
yading@10 1608 }
yading@10 1609 }
yading@10 1610 residue = &vc->residues[mapping->submap_residue[i]];
yading@10 1611 if (ch_left < ch) {
yading@10 1612 av_log(vc->avctx, AV_LOG_ERROR, "Too many channels in vorbis_floor_decode.\n");
yading@10 1613 return -1;
yading@10 1614 }
yading@10 1615 if (ch) {
yading@10 1616 ret = vorbis_residue_decode(vc, residue, ch, do_not_decode, ch_res_ptr, vlen, ch_left);
yading@10 1617 if (ret < 0)
yading@10 1618 return ret;
yading@10 1619 }
yading@10 1620
yading@10 1621 ch_res_ptr += ch * vlen;
yading@10 1622 ch_left -= ch;
yading@10 1623 }
yading@10 1624
yading@10 1625 if (ch_left > 0)
yading@10 1626 return AVERROR_INVALIDDATA;
yading@10 1627
yading@10 1628 // Inverse coupling
yading@10 1629
yading@10 1630 for (i = mapping->coupling_steps - 1; i >= 0; --i) { //warning: i has to be signed
yading@10 1631 float *mag, *ang;
yading@10 1632
yading@10 1633 mag = vc->channel_residues+res_chan[mapping->magnitude[i]] * blocksize / 2;
yading@10 1634 ang = vc->channel_residues+res_chan[mapping->angle[i]] * blocksize / 2;
yading@10 1635 vc->dsp.vorbis_inverse_coupling(mag, ang, blocksize / 2);
yading@10 1636 }
yading@10 1637
yading@10 1638 // Dotproduct, MDCT
yading@10 1639
yading@10 1640 mdct = &vc->mdct[blockflag];
yading@10 1641
yading@10 1642 for (j = vc->audio_channels-1;j >= 0; j--) {
yading@10 1643 ch_res_ptr = vc->channel_residues + res_chan[j] * blocksize / 2;
yading@10 1644 vc->fdsp.vector_fmul(floor_ptr[j], floor_ptr[j], ch_res_ptr, blocksize / 2);
yading@10 1645 mdct->imdct_half(mdct, ch_res_ptr, floor_ptr[j]);
yading@10 1646 }
yading@10 1647
yading@10 1648 // Overlap/add, save data for next overlapping
yading@10 1649
yading@10 1650 retlen = (blocksize + vc->blocksize[previous_window]) / 4;
yading@10 1651 for (j = 0; j < vc->audio_channels; j++) {
yading@10 1652 unsigned bs0 = vc->blocksize[0];
yading@10 1653 unsigned bs1 = vc->blocksize[1];
yading@10 1654 float *residue = vc->channel_residues + res_chan[j] * blocksize / 2;
yading@10 1655 float *saved = vc->saved + j * bs1 / 4;
yading@10 1656 float *ret = floor_ptr[j];
yading@10 1657 float *buf = residue;
yading@10 1658 const float *win = vc->win[blockflag & previous_window];
yading@10 1659
yading@10 1660 if (blockflag == previous_window) {
yading@10 1661 vc->fdsp.vector_fmul_window(ret, saved, buf, win, blocksize / 4);
yading@10 1662 } else if (blockflag > previous_window) {
yading@10 1663 vc->fdsp.vector_fmul_window(ret, saved, buf, win, bs0 / 4);
yading@10 1664 memcpy(ret+bs0/2, buf+bs0/4, ((bs1-bs0)/4) * sizeof(float));
yading@10 1665 } else {
yading@10 1666 memcpy(ret, saved, ((bs1 - bs0) / 4) * sizeof(float));
yading@10 1667 vc->fdsp.vector_fmul_window(ret + (bs1 - bs0) / 4, saved + (bs1 - bs0) / 4, buf, win, bs0 / 4);
yading@10 1668 }
yading@10 1669 memcpy(saved, buf + blocksize / 4, blocksize / 4 * sizeof(float));
yading@10 1670 }
yading@10 1671
yading@10 1672 vc->previous_window = blockflag;
yading@10 1673 return retlen;
yading@10 1674 }
yading@10 1675
yading@10 1676 // Return the decoded audio packet through the standard api
yading@10 1677
yading@10 1678 static int vorbis_decode_frame(AVCodecContext *avctx, void *data,
yading@10 1679 int *got_frame_ptr, AVPacket *avpkt)
yading@10 1680 {
yading@10 1681 const uint8_t *buf = avpkt->data;
yading@10 1682 int buf_size = avpkt->size;
yading@10 1683 vorbis_context *vc = avctx->priv_data;
yading@10 1684 AVFrame *frame = data;
yading@10 1685 GetBitContext *gb = &vc->gb;
yading@10 1686 float *channel_ptrs[255];
yading@10 1687 int i, len, ret;
yading@10 1688
yading@10 1689 av_dlog(NULL, "packet length %d \n", buf_size);
yading@10 1690
yading@10 1691 if (*buf == 1 && buf_size > 7) {
yading@10 1692 init_get_bits(gb, buf+1, buf_size*8 - 8);
yading@10 1693 vorbis_free(vc);
yading@10 1694 if ((ret = vorbis_parse_id_hdr(vc))) {
yading@10 1695 av_log(avctx, AV_LOG_ERROR, "Id header corrupt.\n");
yading@10 1696 vorbis_free(vc);
yading@10 1697 return ret;
yading@10 1698 }
yading@10 1699
yading@10 1700 if (vc->audio_channels > 8)
yading@10 1701 avctx->channel_layout = 0;
yading@10 1702 else
yading@10 1703 avctx->channel_layout = ff_vorbis_channel_layouts[vc->audio_channels - 1];
yading@10 1704
yading@10 1705 avctx->channels = vc->audio_channels;
yading@10 1706 avctx->sample_rate = vc->audio_samplerate;
yading@10 1707 return buf_size;
yading@10 1708 }
yading@10 1709
yading@10 1710 if (*buf == 3 && buf_size > 7) {
yading@10 1711 av_log(avctx, AV_LOG_DEBUG, "Ignoring comment header\n");
yading@10 1712 return buf_size;
yading@10 1713 }
yading@10 1714
yading@10 1715 if (*buf == 5 && buf_size > 7 && vc->channel_residues && !vc->modes) {
yading@10 1716 init_get_bits(gb, buf+1, buf_size*8 - 8);
yading@10 1717 if ((ret = vorbis_parse_setup_hdr(vc))) {
yading@10 1718 av_log(avctx, AV_LOG_ERROR, "Setup header corrupt.\n");
yading@10 1719 vorbis_free(vc);
yading@10 1720 return ret;
yading@10 1721 }
yading@10 1722 return buf_size;
yading@10 1723 }
yading@10 1724
yading@10 1725 if (!vc->channel_residues || !vc->modes) {
yading@10 1726 av_log(avctx, AV_LOG_ERROR, "Data packet before valid headers\n");
yading@10 1727 return AVERROR_INVALIDDATA;
yading@10 1728 }
yading@10 1729
yading@10 1730 /* get output buffer */
yading@10 1731 frame->nb_samples = vc->blocksize[1] / 2;
yading@10 1732 if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
yading@10 1733 return ret;
yading@10 1734
yading@10 1735 if (vc->audio_channels > 8) {
yading@10 1736 for (i = 0; i < vc->audio_channels; i++)
yading@10 1737 channel_ptrs[i] = (float *)frame->extended_data[i];
yading@10 1738 } else {
yading@10 1739 for (i = 0; i < vc->audio_channels; i++) {
yading@10 1740 int ch = ff_vorbis_channel_layout_offsets[vc->audio_channels - 1][i];
yading@10 1741 channel_ptrs[ch] = (float *)frame->extended_data[i];
yading@10 1742 }
yading@10 1743 }
yading@10 1744
yading@10 1745 init_get_bits(gb, buf, buf_size*8);
yading@10 1746
yading@10 1747 if ((len = vorbis_parse_audio_packet(vc, channel_ptrs)) <= 0)
yading@10 1748 return len;
yading@10 1749
yading@10 1750 if (!vc->first_frame) {
yading@10 1751 vc->first_frame = 1;
yading@10 1752 *got_frame_ptr = 0;
yading@10 1753 av_frame_unref(frame);
yading@10 1754 return buf_size;
yading@10 1755 }
yading@10 1756
yading@10 1757 av_dlog(NULL, "parsed %d bytes %d bits, returned %d samples (*ch*bits) \n",
yading@10 1758 get_bits_count(gb) / 8, get_bits_count(gb) % 8, len);
yading@10 1759
yading@10 1760 frame->nb_samples = len;
yading@10 1761 *got_frame_ptr = 1;
yading@10 1762
yading@10 1763 return buf_size;
yading@10 1764 }
yading@10 1765
yading@10 1766 // Close decoder
yading@10 1767
yading@10 1768 static av_cold int vorbis_decode_close(AVCodecContext *avctx)
yading@10 1769 {
yading@10 1770 vorbis_context *vc = avctx->priv_data;
yading@10 1771
yading@10 1772 vorbis_free(vc);
yading@10 1773
yading@10 1774 return 0;
yading@10 1775 }
yading@10 1776
yading@10 1777 static av_cold void vorbis_decode_flush(AVCodecContext *avctx)
yading@10 1778 {
yading@10 1779 vorbis_context *vc = avctx->priv_data;
yading@10 1780
yading@10 1781 if (vc->saved) {
yading@10 1782 memset(vc->saved, 0, (vc->blocksize[1] / 4) * vc->audio_channels *
yading@10 1783 sizeof(*vc->saved));
yading@10 1784 }
yading@10 1785 vc->previous_window = 0;
yading@10 1786 }
yading@10 1787
yading@10 1788 AVCodec ff_vorbis_decoder = {
yading@10 1789 .name = "vorbis",
yading@10 1790 .type = AVMEDIA_TYPE_AUDIO,
yading@10 1791 .id = AV_CODEC_ID_VORBIS,
yading@10 1792 .priv_data_size = sizeof(vorbis_context),
yading@10 1793 .init = vorbis_decode_init,
yading@10 1794 .close = vorbis_decode_close,
yading@10 1795 .decode = vorbis_decode_frame,
yading@10 1796 .flush = vorbis_decode_flush,
yading@10 1797 .capabilities = CODEC_CAP_DR1,
yading@10 1798 .long_name = NULL_IF_CONFIG_SMALL("Vorbis"),
yading@10 1799 .channel_layouts = ff_vorbis_channel_layouts,
yading@10 1800 .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
yading@10 1801 AV_SAMPLE_FMT_NONE },
yading@10 1802 };