annotate ffmpeg/libavcodec/vorbisenc.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 * copyright (c) 2006 Oded Shimon <ods15@ods15.dyndns.org>
yading@10 3 *
yading@10 4 * This file is part of FFmpeg.
yading@10 5 *
yading@10 6 * FFmpeg is free software; you can redistribute it and/or
yading@10 7 * modify it under the terms of the GNU Lesser General Public
yading@10 8 * License as published by the Free Software Foundation; either
yading@10 9 * version 2.1 of the License, or (at your option) any later version.
yading@10 10 *
yading@10 11 * FFmpeg is distributed in the hope that it will be useful,
yading@10 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 14 * Lesser General Public License for more details.
yading@10 15 *
yading@10 16 * You should have received a copy of the GNU Lesser General Public
yading@10 17 * License along with FFmpeg; if not, write to the Free Software
yading@10 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 19 */
yading@10 20
yading@10 21 /**
yading@10 22 * @file
yading@10 23 * Native Vorbis encoder.
yading@10 24 * @author Oded Shimon <ods15@ods15.dyndns.org>
yading@10 25 */
yading@10 26
yading@10 27 #include <float.h>
yading@10 28 #include "avcodec.h"
yading@10 29 #include "internal.h"
yading@10 30 #include "fft.h"
yading@10 31 #include "vorbis.h"
yading@10 32 #include "vorbis_enc_data.h"
yading@10 33
yading@10 34 #define BITSTREAM_WRITER_LE
yading@10 35 #include "put_bits.h"
yading@10 36
yading@10 37 #undef NDEBUG
yading@10 38 #include <assert.h>
yading@10 39
yading@10 40 typedef struct {
yading@10 41 int nentries;
yading@10 42 uint8_t *lens;
yading@10 43 uint32_t *codewords;
yading@10 44 int ndimensions;
yading@10 45 float min;
yading@10 46 float delta;
yading@10 47 int seq_p;
yading@10 48 int lookup;
yading@10 49 int *quantlist;
yading@10 50 float *dimensions;
yading@10 51 float *pow2;
yading@10 52 } vorbis_enc_codebook;
yading@10 53
yading@10 54 typedef struct {
yading@10 55 int dim;
yading@10 56 int subclass;
yading@10 57 int masterbook;
yading@10 58 int *books;
yading@10 59 } vorbis_enc_floor_class;
yading@10 60
yading@10 61 typedef struct {
yading@10 62 int partitions;
yading@10 63 int *partition_to_class;
yading@10 64 int nclasses;
yading@10 65 vorbis_enc_floor_class *classes;
yading@10 66 int multiplier;
yading@10 67 int rangebits;
yading@10 68 int values;
yading@10 69 vorbis_floor1_entry *list;
yading@10 70 } vorbis_enc_floor;
yading@10 71
yading@10 72 typedef struct {
yading@10 73 int type;
yading@10 74 int begin;
yading@10 75 int end;
yading@10 76 int partition_size;
yading@10 77 int classifications;
yading@10 78 int classbook;
yading@10 79 int8_t (*books)[8];
yading@10 80 float (*maxes)[2];
yading@10 81 } vorbis_enc_residue;
yading@10 82
yading@10 83 typedef struct {
yading@10 84 int submaps;
yading@10 85 int *mux;
yading@10 86 int *floor;
yading@10 87 int *residue;
yading@10 88 int coupling_steps;
yading@10 89 int *magnitude;
yading@10 90 int *angle;
yading@10 91 } vorbis_enc_mapping;
yading@10 92
yading@10 93 typedef struct {
yading@10 94 int blockflag;
yading@10 95 int mapping;
yading@10 96 } vorbis_enc_mode;
yading@10 97
yading@10 98 typedef struct {
yading@10 99 int channels;
yading@10 100 int sample_rate;
yading@10 101 int log2_blocksize[2];
yading@10 102 FFTContext mdct[2];
yading@10 103 const float *win[2];
yading@10 104 int have_saved;
yading@10 105 float *saved;
yading@10 106 float *samples;
yading@10 107 float *floor; // also used for tmp values for mdct
yading@10 108 float *coeffs; // also used for residue after floor
yading@10 109 float quality;
yading@10 110
yading@10 111 int ncodebooks;
yading@10 112 vorbis_enc_codebook *codebooks;
yading@10 113
yading@10 114 int nfloors;
yading@10 115 vorbis_enc_floor *floors;
yading@10 116
yading@10 117 int nresidues;
yading@10 118 vorbis_enc_residue *residues;
yading@10 119
yading@10 120 int nmappings;
yading@10 121 vorbis_enc_mapping *mappings;
yading@10 122
yading@10 123 int nmodes;
yading@10 124 vorbis_enc_mode *modes;
yading@10 125
yading@10 126 int64_t next_pts;
yading@10 127 } vorbis_enc_context;
yading@10 128
yading@10 129 #define MAX_CHANNELS 2
yading@10 130 #define MAX_CODEBOOK_DIM 8
yading@10 131
yading@10 132 #define MAX_FLOOR_CLASS_DIM 4
yading@10 133 #define NUM_FLOOR_PARTITIONS 8
yading@10 134 #define MAX_FLOOR_VALUES (MAX_FLOOR_CLASS_DIM*NUM_FLOOR_PARTITIONS+2)
yading@10 135
yading@10 136 #define RESIDUE_SIZE 1600
yading@10 137 #define RESIDUE_PART_SIZE 32
yading@10 138 #define NUM_RESIDUE_PARTITIONS (RESIDUE_SIZE/RESIDUE_PART_SIZE)
yading@10 139
yading@10 140 static inline int put_codeword(PutBitContext *pb, vorbis_enc_codebook *cb,
yading@10 141 int entry)
yading@10 142 {
yading@10 143 assert(entry >= 0);
yading@10 144 assert(entry < cb->nentries);
yading@10 145 assert(cb->lens[entry]);
yading@10 146 if (pb->size_in_bits - put_bits_count(pb) < cb->lens[entry])
yading@10 147 return AVERROR(EINVAL);
yading@10 148 put_bits(pb, cb->lens[entry], cb->codewords[entry]);
yading@10 149 return 0;
yading@10 150 }
yading@10 151
yading@10 152 static int cb_lookup_vals(int lookup, int dimensions, int entries)
yading@10 153 {
yading@10 154 if (lookup == 1)
yading@10 155 return ff_vorbis_nth_root(entries, dimensions);
yading@10 156 else if (lookup == 2)
yading@10 157 return dimensions *entries;
yading@10 158 return 0;
yading@10 159 }
yading@10 160
yading@10 161 static int ready_codebook(vorbis_enc_codebook *cb)
yading@10 162 {
yading@10 163 int i;
yading@10 164
yading@10 165 ff_vorbis_len2vlc(cb->lens, cb->codewords, cb->nentries);
yading@10 166
yading@10 167 if (!cb->lookup) {
yading@10 168 cb->pow2 = cb->dimensions = NULL;
yading@10 169 } else {
yading@10 170 int vals = cb_lookup_vals(cb->lookup, cb->ndimensions, cb->nentries);
yading@10 171 cb->dimensions = av_malloc(sizeof(float) * cb->nentries * cb->ndimensions);
yading@10 172 cb->pow2 = av_mallocz(sizeof(float) * cb->nentries);
yading@10 173 if (!cb->dimensions || !cb->pow2)
yading@10 174 return AVERROR(ENOMEM);
yading@10 175 for (i = 0; i < cb->nentries; i++) {
yading@10 176 float last = 0;
yading@10 177 int j;
yading@10 178 int div = 1;
yading@10 179 for (j = 0; j < cb->ndimensions; j++) {
yading@10 180 int off;
yading@10 181 if (cb->lookup == 1)
yading@10 182 off = (i / div) % vals; // lookup type 1
yading@10 183 else
yading@10 184 off = i * cb->ndimensions + j; // lookup type 2
yading@10 185
yading@10 186 cb->dimensions[i * cb->ndimensions + j] = last + cb->min + cb->quantlist[off] * cb->delta;
yading@10 187 if (cb->seq_p)
yading@10 188 last = cb->dimensions[i * cb->ndimensions + j];
yading@10 189 cb->pow2[i] += cb->dimensions[i * cb->ndimensions + j] * cb->dimensions[i * cb->ndimensions + j];
yading@10 190 div *= vals;
yading@10 191 }
yading@10 192 cb->pow2[i] /= 2.;
yading@10 193 }
yading@10 194 }
yading@10 195 return 0;
yading@10 196 }
yading@10 197
yading@10 198 static int ready_residue(vorbis_enc_residue *rc, vorbis_enc_context *venc)
yading@10 199 {
yading@10 200 int i;
yading@10 201 assert(rc->type == 2);
yading@10 202 rc->maxes = av_mallocz(sizeof(float[2]) * rc->classifications);
yading@10 203 if (!rc->maxes)
yading@10 204 return AVERROR(ENOMEM);
yading@10 205 for (i = 0; i < rc->classifications; i++) {
yading@10 206 int j;
yading@10 207 vorbis_enc_codebook * cb;
yading@10 208 for (j = 0; j < 8; j++)
yading@10 209 if (rc->books[i][j] != -1)
yading@10 210 break;
yading@10 211 if (j == 8) // zero
yading@10 212 continue;
yading@10 213 cb = &venc->codebooks[rc->books[i][j]];
yading@10 214 assert(cb->ndimensions >= 2);
yading@10 215 assert(cb->lookup);
yading@10 216
yading@10 217 for (j = 0; j < cb->nentries; j++) {
yading@10 218 float a;
yading@10 219 if (!cb->lens[j])
yading@10 220 continue;
yading@10 221 a = fabs(cb->dimensions[j * cb->ndimensions]);
yading@10 222 if (a > rc->maxes[i][0])
yading@10 223 rc->maxes[i][0] = a;
yading@10 224 a = fabs(cb->dimensions[j * cb->ndimensions + 1]);
yading@10 225 if (a > rc->maxes[i][1])
yading@10 226 rc->maxes[i][1] = a;
yading@10 227 }
yading@10 228 }
yading@10 229 // small bias
yading@10 230 for (i = 0; i < rc->classifications; i++) {
yading@10 231 rc->maxes[i][0] += 0.8;
yading@10 232 rc->maxes[i][1] += 0.8;
yading@10 233 }
yading@10 234 return 0;
yading@10 235 }
yading@10 236
yading@10 237 static int create_vorbis_context(vorbis_enc_context *venc,
yading@10 238 AVCodecContext *avctx)
yading@10 239 {
yading@10 240 vorbis_enc_floor *fc;
yading@10 241 vorbis_enc_residue *rc;
yading@10 242 vorbis_enc_mapping *mc;
yading@10 243 int i, book, ret;
yading@10 244
yading@10 245 venc->channels = avctx->channels;
yading@10 246 venc->sample_rate = avctx->sample_rate;
yading@10 247 venc->log2_blocksize[0] = venc->log2_blocksize[1] = 11;
yading@10 248
yading@10 249 venc->ncodebooks = FF_ARRAY_ELEMS(cvectors);
yading@10 250 venc->codebooks = av_malloc(sizeof(vorbis_enc_codebook) * venc->ncodebooks);
yading@10 251 if (!venc->codebooks)
yading@10 252 return AVERROR(ENOMEM);
yading@10 253
yading@10 254 // codebook 0..14 - floor1 book, values 0..255
yading@10 255 // codebook 15 residue masterbook
yading@10 256 // codebook 16..29 residue
yading@10 257 for (book = 0; book < venc->ncodebooks; book++) {
yading@10 258 vorbis_enc_codebook *cb = &venc->codebooks[book];
yading@10 259 int vals;
yading@10 260 cb->ndimensions = cvectors[book].dim;
yading@10 261 cb->nentries = cvectors[book].real_len;
yading@10 262 cb->min = cvectors[book].min;
yading@10 263 cb->delta = cvectors[book].delta;
yading@10 264 cb->lookup = cvectors[book].lookup;
yading@10 265 cb->seq_p = 0;
yading@10 266
yading@10 267 cb->lens = av_malloc(sizeof(uint8_t) * cb->nentries);
yading@10 268 cb->codewords = av_malloc(sizeof(uint32_t) * cb->nentries);
yading@10 269 if (!cb->lens || !cb->codewords)
yading@10 270 return AVERROR(ENOMEM);
yading@10 271 memcpy(cb->lens, cvectors[book].clens, cvectors[book].len);
yading@10 272 memset(cb->lens + cvectors[book].len, 0, cb->nentries - cvectors[book].len);
yading@10 273
yading@10 274 if (cb->lookup) {
yading@10 275 vals = cb_lookup_vals(cb->lookup, cb->ndimensions, cb->nentries);
yading@10 276 cb->quantlist = av_malloc(sizeof(int) * vals);
yading@10 277 if (!cb->quantlist)
yading@10 278 return AVERROR(ENOMEM);
yading@10 279 for (i = 0; i < vals; i++)
yading@10 280 cb->quantlist[i] = cvectors[book].quant[i];
yading@10 281 } else {
yading@10 282 cb->quantlist = NULL;
yading@10 283 }
yading@10 284 if ((ret = ready_codebook(cb)) < 0)
yading@10 285 return ret;
yading@10 286 }
yading@10 287
yading@10 288 venc->nfloors = 1;
yading@10 289 venc->floors = av_malloc(sizeof(vorbis_enc_floor) * venc->nfloors);
yading@10 290 if (!venc->floors)
yading@10 291 return AVERROR(ENOMEM);
yading@10 292
yading@10 293 // just 1 floor
yading@10 294 fc = &venc->floors[0];
yading@10 295 fc->partitions = NUM_FLOOR_PARTITIONS;
yading@10 296 fc->partition_to_class = av_malloc(sizeof(int) * fc->partitions);
yading@10 297 if (!fc->partition_to_class)
yading@10 298 return AVERROR(ENOMEM);
yading@10 299 fc->nclasses = 0;
yading@10 300 for (i = 0; i < fc->partitions; i++) {
yading@10 301 static const int a[] = {0, 1, 2, 2, 3, 3, 4, 4};
yading@10 302 fc->partition_to_class[i] = a[i];
yading@10 303 fc->nclasses = FFMAX(fc->nclasses, fc->partition_to_class[i]);
yading@10 304 }
yading@10 305 fc->nclasses++;
yading@10 306 fc->classes = av_malloc(sizeof(vorbis_enc_floor_class) * fc->nclasses);
yading@10 307 if (!fc->classes)
yading@10 308 return AVERROR(ENOMEM);
yading@10 309 for (i = 0; i < fc->nclasses; i++) {
yading@10 310 vorbis_enc_floor_class * c = &fc->classes[i];
yading@10 311 int j, books;
yading@10 312 c->dim = floor_classes[i].dim;
yading@10 313 c->subclass = floor_classes[i].subclass;
yading@10 314 c->masterbook = floor_classes[i].masterbook;
yading@10 315 books = (1 << c->subclass);
yading@10 316 c->books = av_malloc(sizeof(int) * books);
yading@10 317 if (!c->books)
yading@10 318 return AVERROR(ENOMEM);
yading@10 319 for (j = 0; j < books; j++)
yading@10 320 c->books[j] = floor_classes[i].nbooks[j];
yading@10 321 }
yading@10 322 fc->multiplier = 2;
yading@10 323 fc->rangebits = venc->log2_blocksize[0] - 1;
yading@10 324
yading@10 325 fc->values = 2;
yading@10 326 for (i = 0; i < fc->partitions; i++)
yading@10 327 fc->values += fc->classes[fc->partition_to_class[i]].dim;
yading@10 328
yading@10 329 fc->list = av_malloc(sizeof(vorbis_floor1_entry) * fc->values);
yading@10 330 if (!fc->list)
yading@10 331 return AVERROR(ENOMEM);
yading@10 332 fc->list[0].x = 0;
yading@10 333 fc->list[1].x = 1 << fc->rangebits;
yading@10 334 for (i = 2; i < fc->values; i++) {
yading@10 335 static const int a[] = {
yading@10 336 93, 23,372, 6, 46,186,750, 14, 33, 65,
yading@10 337 130,260,556, 3, 10, 18, 28, 39, 55, 79,
yading@10 338 111,158,220,312,464,650,850
yading@10 339 };
yading@10 340 fc->list[i].x = a[i - 2];
yading@10 341 }
yading@10 342 if (ff_vorbis_ready_floor1_list(avctx, fc->list, fc->values))
yading@10 343 return AVERROR_BUG;
yading@10 344
yading@10 345 venc->nresidues = 1;
yading@10 346 venc->residues = av_malloc(sizeof(vorbis_enc_residue) * venc->nresidues);
yading@10 347 if (!venc->residues)
yading@10 348 return AVERROR(ENOMEM);
yading@10 349
yading@10 350 // single residue
yading@10 351 rc = &venc->residues[0];
yading@10 352 rc->type = 2;
yading@10 353 rc->begin = 0;
yading@10 354 rc->end = 1600;
yading@10 355 rc->partition_size = 32;
yading@10 356 rc->classifications = 10;
yading@10 357 rc->classbook = 15;
yading@10 358 rc->books = av_malloc(sizeof(*rc->books) * rc->classifications);
yading@10 359 if (!rc->books)
yading@10 360 return AVERROR(ENOMEM);
yading@10 361 {
yading@10 362 static const int8_t a[10][8] = {
yading@10 363 { -1, -1, -1, -1, -1, -1, -1, -1, },
yading@10 364 { -1, -1, 16, -1, -1, -1, -1, -1, },
yading@10 365 { -1, -1, 17, -1, -1, -1, -1, -1, },
yading@10 366 { -1, -1, 18, -1, -1, -1, -1, -1, },
yading@10 367 { -1, -1, 19, -1, -1, -1, -1, -1, },
yading@10 368 { -1, -1, 20, -1, -1, -1, -1, -1, },
yading@10 369 { -1, -1, 21, -1, -1, -1, -1, -1, },
yading@10 370 { 22, 23, -1, -1, -1, -1, -1, -1, },
yading@10 371 { 24, 25, -1, -1, -1, -1, -1, -1, },
yading@10 372 { 26, 27, 28, -1, -1, -1, -1, -1, },
yading@10 373 };
yading@10 374 memcpy(rc->books, a, sizeof a);
yading@10 375 }
yading@10 376 if ((ret = ready_residue(rc, venc)) < 0)
yading@10 377 return ret;
yading@10 378
yading@10 379 venc->nmappings = 1;
yading@10 380 venc->mappings = av_malloc(sizeof(vorbis_enc_mapping) * venc->nmappings);
yading@10 381 if (!venc->mappings)
yading@10 382 return AVERROR(ENOMEM);
yading@10 383
yading@10 384 // single mapping
yading@10 385 mc = &venc->mappings[0];
yading@10 386 mc->submaps = 1;
yading@10 387 mc->mux = av_malloc(sizeof(int) * venc->channels);
yading@10 388 if (!mc->mux)
yading@10 389 return AVERROR(ENOMEM);
yading@10 390 for (i = 0; i < venc->channels; i++)
yading@10 391 mc->mux[i] = 0;
yading@10 392 mc->floor = av_malloc(sizeof(int) * mc->submaps);
yading@10 393 mc->residue = av_malloc(sizeof(int) * mc->submaps);
yading@10 394 if (!mc->floor || !mc->residue)
yading@10 395 return AVERROR(ENOMEM);
yading@10 396 for (i = 0; i < mc->submaps; i++) {
yading@10 397 mc->floor[i] = 0;
yading@10 398 mc->residue[i] = 0;
yading@10 399 }
yading@10 400 mc->coupling_steps = venc->channels == 2 ? 1 : 0;
yading@10 401 mc->magnitude = av_malloc(sizeof(int) * mc->coupling_steps);
yading@10 402 mc->angle = av_malloc(sizeof(int) * mc->coupling_steps);
yading@10 403 if (!mc->magnitude || !mc->angle)
yading@10 404 return AVERROR(ENOMEM);
yading@10 405 if (mc->coupling_steps) {
yading@10 406 mc->magnitude[0] = 0;
yading@10 407 mc->angle[0] = 1;
yading@10 408 }
yading@10 409
yading@10 410 venc->nmodes = 1;
yading@10 411 venc->modes = av_malloc(sizeof(vorbis_enc_mode) * venc->nmodes);
yading@10 412 if (!venc->modes)
yading@10 413 return AVERROR(ENOMEM);
yading@10 414
yading@10 415 // single mode
yading@10 416 venc->modes[0].blockflag = 0;
yading@10 417 venc->modes[0].mapping = 0;
yading@10 418
yading@10 419 venc->have_saved = 0;
yading@10 420 venc->saved = av_malloc(sizeof(float) * venc->channels * (1 << venc->log2_blocksize[1]) / 2);
yading@10 421 venc->samples = av_malloc(sizeof(float) * venc->channels * (1 << venc->log2_blocksize[1]));
yading@10 422 venc->floor = av_malloc(sizeof(float) * venc->channels * (1 << venc->log2_blocksize[1]) / 2);
yading@10 423 venc->coeffs = av_malloc(sizeof(float) * venc->channels * (1 << venc->log2_blocksize[1]) / 2);
yading@10 424 if (!venc->saved || !venc->samples || !venc->floor || !venc->coeffs)
yading@10 425 return AVERROR(ENOMEM);
yading@10 426
yading@10 427 venc->win[0] = ff_vorbis_vwin[venc->log2_blocksize[0] - 6];
yading@10 428 venc->win[1] = ff_vorbis_vwin[venc->log2_blocksize[1] - 6];
yading@10 429
yading@10 430 if ((ret = ff_mdct_init(&venc->mdct[0], venc->log2_blocksize[0], 0, 1.0)) < 0)
yading@10 431 return ret;
yading@10 432 if ((ret = ff_mdct_init(&venc->mdct[1], venc->log2_blocksize[1], 0, 1.0)) < 0)
yading@10 433 return ret;
yading@10 434
yading@10 435 return 0;
yading@10 436 }
yading@10 437
yading@10 438 static void put_float(PutBitContext *pb, float f)
yading@10 439 {
yading@10 440 int exp, mant;
yading@10 441 uint32_t res = 0;
yading@10 442 mant = (int)ldexp(frexp(f, &exp), 20);
yading@10 443 exp += 788 - 20;
yading@10 444 if (mant < 0) {
yading@10 445 res |= (1U << 31);
yading@10 446 mant = -mant;
yading@10 447 }
yading@10 448 res |= mant | (exp << 21);
yading@10 449 put_bits32(pb, res);
yading@10 450 }
yading@10 451
yading@10 452 static void put_codebook_header(PutBitContext *pb, vorbis_enc_codebook *cb)
yading@10 453 {
yading@10 454 int i;
yading@10 455 int ordered = 0;
yading@10 456
yading@10 457 put_bits(pb, 24, 0x564342); //magic
yading@10 458 put_bits(pb, 16, cb->ndimensions);
yading@10 459 put_bits(pb, 24, cb->nentries);
yading@10 460
yading@10 461 for (i = 1; i < cb->nentries; i++)
yading@10 462 if (cb->lens[i] < cb->lens[i-1])
yading@10 463 break;
yading@10 464 if (i == cb->nentries)
yading@10 465 ordered = 1;
yading@10 466
yading@10 467 put_bits(pb, 1, ordered);
yading@10 468 if (ordered) {
yading@10 469 int len = cb->lens[0];
yading@10 470 put_bits(pb, 5, len - 1);
yading@10 471 i = 0;
yading@10 472 while (i < cb->nentries) {
yading@10 473 int j;
yading@10 474 for (j = 0; j+i < cb->nentries; j++)
yading@10 475 if (cb->lens[j+i] != len)
yading@10 476 break;
yading@10 477 put_bits(pb, ilog(cb->nentries - i), j);
yading@10 478 i += j;
yading@10 479 len++;
yading@10 480 }
yading@10 481 } else {
yading@10 482 int sparse = 0;
yading@10 483 for (i = 0; i < cb->nentries; i++)
yading@10 484 if (!cb->lens[i])
yading@10 485 break;
yading@10 486 if (i != cb->nentries)
yading@10 487 sparse = 1;
yading@10 488 put_bits(pb, 1, sparse);
yading@10 489
yading@10 490 for (i = 0; i < cb->nentries; i++) {
yading@10 491 if (sparse)
yading@10 492 put_bits(pb, 1, !!cb->lens[i]);
yading@10 493 if (cb->lens[i])
yading@10 494 put_bits(pb, 5, cb->lens[i] - 1);
yading@10 495 }
yading@10 496 }
yading@10 497
yading@10 498 put_bits(pb, 4, cb->lookup);
yading@10 499 if (cb->lookup) {
yading@10 500 int tmp = cb_lookup_vals(cb->lookup, cb->ndimensions, cb->nentries);
yading@10 501 int bits = ilog(cb->quantlist[0]);
yading@10 502
yading@10 503 for (i = 1; i < tmp; i++)
yading@10 504 bits = FFMAX(bits, ilog(cb->quantlist[i]));
yading@10 505
yading@10 506 put_float(pb, cb->min);
yading@10 507 put_float(pb, cb->delta);
yading@10 508
yading@10 509 put_bits(pb, 4, bits - 1);
yading@10 510 put_bits(pb, 1, cb->seq_p);
yading@10 511
yading@10 512 for (i = 0; i < tmp; i++)
yading@10 513 put_bits(pb, bits, cb->quantlist[i]);
yading@10 514 }
yading@10 515 }
yading@10 516
yading@10 517 static void put_floor_header(PutBitContext *pb, vorbis_enc_floor *fc)
yading@10 518 {
yading@10 519 int i;
yading@10 520
yading@10 521 put_bits(pb, 16, 1); // type, only floor1 is supported
yading@10 522
yading@10 523 put_bits(pb, 5, fc->partitions);
yading@10 524
yading@10 525 for (i = 0; i < fc->partitions; i++)
yading@10 526 put_bits(pb, 4, fc->partition_to_class[i]);
yading@10 527
yading@10 528 for (i = 0; i < fc->nclasses; i++) {
yading@10 529 int j, books;
yading@10 530
yading@10 531 put_bits(pb, 3, fc->classes[i].dim - 1);
yading@10 532 put_bits(pb, 2, fc->classes[i].subclass);
yading@10 533
yading@10 534 if (fc->classes[i].subclass)
yading@10 535 put_bits(pb, 8, fc->classes[i].masterbook);
yading@10 536
yading@10 537 books = (1 << fc->classes[i].subclass);
yading@10 538
yading@10 539 for (j = 0; j < books; j++)
yading@10 540 put_bits(pb, 8, fc->classes[i].books[j] + 1);
yading@10 541 }
yading@10 542
yading@10 543 put_bits(pb, 2, fc->multiplier - 1);
yading@10 544 put_bits(pb, 4, fc->rangebits);
yading@10 545
yading@10 546 for (i = 2; i < fc->values; i++)
yading@10 547 put_bits(pb, fc->rangebits, fc->list[i].x);
yading@10 548 }
yading@10 549
yading@10 550 static void put_residue_header(PutBitContext *pb, vorbis_enc_residue *rc)
yading@10 551 {
yading@10 552 int i;
yading@10 553
yading@10 554 put_bits(pb, 16, rc->type);
yading@10 555
yading@10 556 put_bits(pb, 24, rc->begin);
yading@10 557 put_bits(pb, 24, rc->end);
yading@10 558 put_bits(pb, 24, rc->partition_size - 1);
yading@10 559 put_bits(pb, 6, rc->classifications - 1);
yading@10 560 put_bits(pb, 8, rc->classbook);
yading@10 561
yading@10 562 for (i = 0; i < rc->classifications; i++) {
yading@10 563 int j, tmp = 0;
yading@10 564 for (j = 0; j < 8; j++)
yading@10 565 tmp |= (rc->books[i][j] != -1) << j;
yading@10 566
yading@10 567 put_bits(pb, 3, tmp & 7);
yading@10 568 put_bits(pb, 1, tmp > 7);
yading@10 569
yading@10 570 if (tmp > 7)
yading@10 571 put_bits(pb, 5, tmp >> 3);
yading@10 572 }
yading@10 573
yading@10 574 for (i = 0; i < rc->classifications; i++) {
yading@10 575 int j;
yading@10 576 for (j = 0; j < 8; j++)
yading@10 577 if (rc->books[i][j] != -1)
yading@10 578 put_bits(pb, 8, rc->books[i][j]);
yading@10 579 }
yading@10 580 }
yading@10 581
yading@10 582 static int put_main_header(vorbis_enc_context *venc, uint8_t **out)
yading@10 583 {
yading@10 584 int i;
yading@10 585 PutBitContext pb;
yading@10 586 uint8_t buffer[50000] = {0}, *p = buffer;
yading@10 587 int buffer_len = sizeof buffer;
yading@10 588 int len, hlens[3];
yading@10 589
yading@10 590 // identification header
yading@10 591 init_put_bits(&pb, p, buffer_len);
yading@10 592 put_bits(&pb, 8, 1); //magic
yading@10 593 for (i = 0; "vorbis"[i]; i++)
yading@10 594 put_bits(&pb, 8, "vorbis"[i]);
yading@10 595 put_bits32(&pb, 0); // version
yading@10 596 put_bits(&pb, 8, venc->channels);
yading@10 597 put_bits32(&pb, venc->sample_rate);
yading@10 598 put_bits32(&pb, 0); // bitrate
yading@10 599 put_bits32(&pb, 0); // bitrate
yading@10 600 put_bits32(&pb, 0); // bitrate
yading@10 601 put_bits(&pb, 4, venc->log2_blocksize[0]);
yading@10 602 put_bits(&pb, 4, venc->log2_blocksize[1]);
yading@10 603 put_bits(&pb, 1, 1); // framing
yading@10 604
yading@10 605 flush_put_bits(&pb);
yading@10 606 hlens[0] = put_bits_count(&pb) >> 3;
yading@10 607 buffer_len -= hlens[0];
yading@10 608 p += hlens[0];
yading@10 609
yading@10 610 // comment header
yading@10 611 init_put_bits(&pb, p, buffer_len);
yading@10 612 put_bits(&pb, 8, 3); //magic
yading@10 613 for (i = 0; "vorbis"[i]; i++)
yading@10 614 put_bits(&pb, 8, "vorbis"[i]);
yading@10 615 put_bits32(&pb, 0); // vendor length TODO
yading@10 616 put_bits32(&pb, 0); // amount of comments
yading@10 617 put_bits(&pb, 1, 1); // framing
yading@10 618
yading@10 619 flush_put_bits(&pb);
yading@10 620 hlens[1] = put_bits_count(&pb) >> 3;
yading@10 621 buffer_len -= hlens[1];
yading@10 622 p += hlens[1];
yading@10 623
yading@10 624 // setup header
yading@10 625 init_put_bits(&pb, p, buffer_len);
yading@10 626 put_bits(&pb, 8, 5); //magic
yading@10 627 for (i = 0; "vorbis"[i]; i++)
yading@10 628 put_bits(&pb, 8, "vorbis"[i]);
yading@10 629
yading@10 630 // codebooks
yading@10 631 put_bits(&pb, 8, venc->ncodebooks - 1);
yading@10 632 for (i = 0; i < venc->ncodebooks; i++)
yading@10 633 put_codebook_header(&pb, &venc->codebooks[i]);
yading@10 634
yading@10 635 // time domain, reserved, zero
yading@10 636 put_bits(&pb, 6, 0);
yading@10 637 put_bits(&pb, 16, 0);
yading@10 638
yading@10 639 // floors
yading@10 640 put_bits(&pb, 6, venc->nfloors - 1);
yading@10 641 for (i = 0; i < venc->nfloors; i++)
yading@10 642 put_floor_header(&pb, &venc->floors[i]);
yading@10 643
yading@10 644 // residues
yading@10 645 put_bits(&pb, 6, venc->nresidues - 1);
yading@10 646 for (i = 0; i < venc->nresidues; i++)
yading@10 647 put_residue_header(&pb, &venc->residues[i]);
yading@10 648
yading@10 649 // mappings
yading@10 650 put_bits(&pb, 6, venc->nmappings - 1);
yading@10 651 for (i = 0; i < venc->nmappings; i++) {
yading@10 652 vorbis_enc_mapping *mc = &venc->mappings[i];
yading@10 653 int j;
yading@10 654 put_bits(&pb, 16, 0); // mapping type
yading@10 655
yading@10 656 put_bits(&pb, 1, mc->submaps > 1);
yading@10 657 if (mc->submaps > 1)
yading@10 658 put_bits(&pb, 4, mc->submaps - 1);
yading@10 659
yading@10 660 put_bits(&pb, 1, !!mc->coupling_steps);
yading@10 661 if (mc->coupling_steps) {
yading@10 662 put_bits(&pb, 8, mc->coupling_steps - 1);
yading@10 663 for (j = 0; j < mc->coupling_steps; j++) {
yading@10 664 put_bits(&pb, ilog(venc->channels - 1), mc->magnitude[j]);
yading@10 665 put_bits(&pb, ilog(venc->channels - 1), mc->angle[j]);
yading@10 666 }
yading@10 667 }
yading@10 668
yading@10 669 put_bits(&pb, 2, 0); // reserved
yading@10 670
yading@10 671 if (mc->submaps > 1)
yading@10 672 for (j = 0; j < venc->channels; j++)
yading@10 673 put_bits(&pb, 4, mc->mux[j]);
yading@10 674
yading@10 675 for (j = 0; j < mc->submaps; j++) {
yading@10 676 put_bits(&pb, 8, 0); // reserved time configuration
yading@10 677 put_bits(&pb, 8, mc->floor[j]);
yading@10 678 put_bits(&pb, 8, mc->residue[j]);
yading@10 679 }
yading@10 680 }
yading@10 681
yading@10 682 // modes
yading@10 683 put_bits(&pb, 6, venc->nmodes - 1);
yading@10 684 for (i = 0; i < venc->nmodes; i++) {
yading@10 685 put_bits(&pb, 1, venc->modes[i].blockflag);
yading@10 686 put_bits(&pb, 16, 0); // reserved window type
yading@10 687 put_bits(&pb, 16, 0); // reserved transform type
yading@10 688 put_bits(&pb, 8, venc->modes[i].mapping);
yading@10 689 }
yading@10 690
yading@10 691 put_bits(&pb, 1, 1); // framing
yading@10 692
yading@10 693 flush_put_bits(&pb);
yading@10 694 hlens[2] = put_bits_count(&pb) >> 3;
yading@10 695
yading@10 696 len = hlens[0] + hlens[1] + hlens[2];
yading@10 697 p = *out = av_mallocz(64 + len + len/255);
yading@10 698 if (!p)
yading@10 699 return AVERROR(ENOMEM);
yading@10 700
yading@10 701 *p++ = 2;
yading@10 702 p += av_xiphlacing(p, hlens[0]);
yading@10 703 p += av_xiphlacing(p, hlens[1]);
yading@10 704 buffer_len = 0;
yading@10 705 for (i = 0; i < 3; i++) {
yading@10 706 memcpy(p, buffer + buffer_len, hlens[i]);
yading@10 707 p += hlens[i];
yading@10 708 buffer_len += hlens[i];
yading@10 709 }
yading@10 710
yading@10 711 return p - *out;
yading@10 712 }
yading@10 713
yading@10 714 static float get_floor_average(vorbis_enc_floor * fc, float *coeffs, int i)
yading@10 715 {
yading@10 716 int begin = fc->list[fc->list[FFMAX(i-1, 0)].sort].x;
yading@10 717 int end = fc->list[fc->list[FFMIN(i+1, fc->values - 1)].sort].x;
yading@10 718 int j;
yading@10 719 float average = 0;
yading@10 720
yading@10 721 for (j = begin; j < end; j++)
yading@10 722 average += fabs(coeffs[j]);
yading@10 723 return average / (end - begin);
yading@10 724 }
yading@10 725
yading@10 726 static void floor_fit(vorbis_enc_context *venc, vorbis_enc_floor *fc,
yading@10 727 float *coeffs, uint16_t *posts, int samples)
yading@10 728 {
yading@10 729 int range = 255 / fc->multiplier + 1;
yading@10 730 int i;
yading@10 731 float tot_average = 0.;
yading@10 732 float averages[MAX_FLOOR_VALUES];
yading@10 733 for (i = 0; i < fc->values; i++) {
yading@10 734 averages[i] = get_floor_average(fc, coeffs, i);
yading@10 735 tot_average += averages[i];
yading@10 736 }
yading@10 737 tot_average /= fc->values;
yading@10 738 tot_average /= venc->quality;
yading@10 739
yading@10 740 for (i = 0; i < fc->values; i++) {
yading@10 741 int position = fc->list[fc->list[i].sort].x;
yading@10 742 float average = averages[i];
yading@10 743 int j;
yading@10 744
yading@10 745 average = sqrt(tot_average * average) * pow(1.25f, position*0.005f); // MAGIC!
yading@10 746 for (j = 0; j < range - 1; j++)
yading@10 747 if (ff_vorbis_floor1_inverse_db_table[j * fc->multiplier] > average)
yading@10 748 break;
yading@10 749 posts[fc->list[i].sort] = j;
yading@10 750 }
yading@10 751 }
yading@10 752
yading@10 753 static int render_point(int x0, int y0, int x1, int y1, int x)
yading@10 754 {
yading@10 755 return y0 + (x - x0) * (y1 - y0) / (x1 - x0);
yading@10 756 }
yading@10 757
yading@10 758 static int floor_encode(vorbis_enc_context *venc, vorbis_enc_floor *fc,
yading@10 759 PutBitContext *pb, uint16_t *posts,
yading@10 760 float *floor, int samples)
yading@10 761 {
yading@10 762 int range = 255 / fc->multiplier + 1;
yading@10 763 int coded[MAX_FLOOR_VALUES]; // first 2 values are unused
yading@10 764 int i, counter;
yading@10 765
yading@10 766 if (pb->size_in_bits - put_bits_count(pb) < 1 + 2 * ilog(range - 1))
yading@10 767 return AVERROR(EINVAL);
yading@10 768 put_bits(pb, 1, 1); // non zero
yading@10 769 put_bits(pb, ilog(range - 1), posts[0]);
yading@10 770 put_bits(pb, ilog(range - 1), posts[1]);
yading@10 771 coded[0] = coded[1] = 1;
yading@10 772
yading@10 773 for (i = 2; i < fc->values; i++) {
yading@10 774 int predicted = render_point(fc->list[fc->list[i].low].x,
yading@10 775 posts[fc->list[i].low],
yading@10 776 fc->list[fc->list[i].high].x,
yading@10 777 posts[fc->list[i].high],
yading@10 778 fc->list[i].x);
yading@10 779 int highroom = range - predicted;
yading@10 780 int lowroom = predicted;
yading@10 781 int room = FFMIN(highroom, lowroom);
yading@10 782 if (predicted == posts[i]) {
yading@10 783 coded[i] = 0; // must be used later as flag!
yading@10 784 continue;
yading@10 785 } else {
yading@10 786 if (!coded[fc->list[i].low ])
yading@10 787 coded[fc->list[i].low ] = -1;
yading@10 788 if (!coded[fc->list[i].high])
yading@10 789 coded[fc->list[i].high] = -1;
yading@10 790 }
yading@10 791 if (posts[i] > predicted) {
yading@10 792 if (posts[i] - predicted > room)
yading@10 793 coded[i] = posts[i] - predicted + lowroom;
yading@10 794 else
yading@10 795 coded[i] = (posts[i] - predicted) << 1;
yading@10 796 } else {
yading@10 797 if (predicted - posts[i] > room)
yading@10 798 coded[i] = predicted - posts[i] + highroom - 1;
yading@10 799 else
yading@10 800 coded[i] = ((predicted - posts[i]) << 1) - 1;
yading@10 801 }
yading@10 802 }
yading@10 803
yading@10 804 counter = 2;
yading@10 805 for (i = 0; i < fc->partitions; i++) {
yading@10 806 vorbis_enc_floor_class * c = &fc->classes[fc->partition_to_class[i]];
yading@10 807 int k, cval = 0, csub = 1<<c->subclass;
yading@10 808 if (c->subclass) {
yading@10 809 vorbis_enc_codebook * book = &venc->codebooks[c->masterbook];
yading@10 810 int cshift = 0;
yading@10 811 for (k = 0; k < c->dim; k++) {
yading@10 812 int l;
yading@10 813 for (l = 0; l < csub; l++) {
yading@10 814 int maxval = 1;
yading@10 815 if (c->books[l] != -1)
yading@10 816 maxval = venc->codebooks[c->books[l]].nentries;
yading@10 817 // coded could be -1, but this still works, cause that is 0
yading@10 818 if (coded[counter + k] < maxval)
yading@10 819 break;
yading@10 820 }
yading@10 821 assert(l != csub);
yading@10 822 cval |= l << cshift;
yading@10 823 cshift += c->subclass;
yading@10 824 }
yading@10 825 if (put_codeword(pb, book, cval))
yading@10 826 return AVERROR(EINVAL);
yading@10 827 }
yading@10 828 for (k = 0; k < c->dim; k++) {
yading@10 829 int book = c->books[cval & (csub-1)];
yading@10 830 int entry = coded[counter++];
yading@10 831 cval >>= c->subclass;
yading@10 832 if (book == -1)
yading@10 833 continue;
yading@10 834 if (entry == -1)
yading@10 835 entry = 0;
yading@10 836 if (put_codeword(pb, &venc->codebooks[book], entry))
yading@10 837 return AVERROR(EINVAL);
yading@10 838 }
yading@10 839 }
yading@10 840
yading@10 841 ff_vorbis_floor1_render_list(fc->list, fc->values, posts, coded,
yading@10 842 fc->multiplier, floor, samples);
yading@10 843
yading@10 844 return 0;
yading@10 845 }
yading@10 846
yading@10 847 static float *put_vector(vorbis_enc_codebook *book, PutBitContext *pb,
yading@10 848 float *num)
yading@10 849 {
yading@10 850 int i, entry = -1;
yading@10 851 float distance = FLT_MAX;
yading@10 852 assert(book->dimensions);
yading@10 853 for (i = 0; i < book->nentries; i++) {
yading@10 854 float * vec = book->dimensions + i * book->ndimensions, d = book->pow2[i];
yading@10 855 int j;
yading@10 856 if (!book->lens[i])
yading@10 857 continue;
yading@10 858 for (j = 0; j < book->ndimensions; j++)
yading@10 859 d -= vec[j] * num[j];
yading@10 860 if (distance > d) {
yading@10 861 entry = i;
yading@10 862 distance = d;
yading@10 863 }
yading@10 864 }
yading@10 865 if (put_codeword(pb, book, entry))
yading@10 866 return NULL;
yading@10 867 return &book->dimensions[entry * book->ndimensions];
yading@10 868 }
yading@10 869
yading@10 870 static int residue_encode(vorbis_enc_context *venc, vorbis_enc_residue *rc,
yading@10 871 PutBitContext *pb, float *coeffs, int samples,
yading@10 872 int real_ch)
yading@10 873 {
yading@10 874 int pass, i, j, p, k;
yading@10 875 int psize = rc->partition_size;
yading@10 876 int partitions = (rc->end - rc->begin) / psize;
yading@10 877 int channels = (rc->type == 2) ? 1 : real_ch;
yading@10 878 int classes[MAX_CHANNELS][NUM_RESIDUE_PARTITIONS];
yading@10 879 int classwords = venc->codebooks[rc->classbook].ndimensions;
yading@10 880
yading@10 881 assert(rc->type == 2);
yading@10 882 assert(real_ch == 2);
yading@10 883 for (p = 0; p < partitions; p++) {
yading@10 884 float max1 = 0., max2 = 0.;
yading@10 885 int s = rc->begin + p * psize;
yading@10 886 for (k = s; k < s + psize; k += 2) {
yading@10 887 max1 = FFMAX(max1, fabs(coeffs[ k / real_ch]));
yading@10 888 max2 = FFMAX(max2, fabs(coeffs[samples + k / real_ch]));
yading@10 889 }
yading@10 890
yading@10 891 for (i = 0; i < rc->classifications - 1; i++)
yading@10 892 if (max1 < rc->maxes[i][0] && max2 < rc->maxes[i][1])
yading@10 893 break;
yading@10 894 classes[0][p] = i;
yading@10 895 }
yading@10 896
yading@10 897 for (pass = 0; pass < 8; pass++) {
yading@10 898 p = 0;
yading@10 899 while (p < partitions) {
yading@10 900 if (pass == 0)
yading@10 901 for (j = 0; j < channels; j++) {
yading@10 902 vorbis_enc_codebook * book = &venc->codebooks[rc->classbook];
yading@10 903 int entry = 0;
yading@10 904 for (i = 0; i < classwords; i++) {
yading@10 905 entry *= rc->classifications;
yading@10 906 entry += classes[j][p + i];
yading@10 907 }
yading@10 908 if (put_codeword(pb, book, entry))
yading@10 909 return AVERROR(EINVAL);
yading@10 910 }
yading@10 911 for (i = 0; i < classwords && p < partitions; i++, p++) {
yading@10 912 for (j = 0; j < channels; j++) {
yading@10 913 int nbook = rc->books[classes[j][p]][pass];
yading@10 914 vorbis_enc_codebook * book = &venc->codebooks[nbook];
yading@10 915 float *buf = coeffs + samples*j + rc->begin + p*psize;
yading@10 916 if (nbook == -1)
yading@10 917 continue;
yading@10 918
yading@10 919 assert(rc->type == 0 || rc->type == 2);
yading@10 920 assert(!(psize % book->ndimensions));
yading@10 921
yading@10 922 if (rc->type == 0) {
yading@10 923 for (k = 0; k < psize; k += book->ndimensions) {
yading@10 924 int l;
yading@10 925 float *a = put_vector(book, pb, &buf[k]);
yading@10 926 if (!a)
yading@10 927 return AVERROR(EINVAL);
yading@10 928 for (l = 0; l < book->ndimensions; l++)
yading@10 929 buf[k + l] -= a[l];
yading@10 930 }
yading@10 931 } else {
yading@10 932 int s = rc->begin + p * psize, a1, b1;
yading@10 933 a1 = (s % real_ch) * samples;
yading@10 934 b1 = s / real_ch;
yading@10 935 s = real_ch * samples;
yading@10 936 for (k = 0; k < psize; k += book->ndimensions) {
yading@10 937 int dim, a2 = a1, b2 = b1;
yading@10 938 float vec[MAX_CODEBOOK_DIM], *pv = vec;
yading@10 939 for (dim = book->ndimensions; dim--; ) {
yading@10 940 *pv++ = coeffs[a2 + b2];
yading@10 941 if ((a2 += samples) == s) {
yading@10 942 a2 = 0;
yading@10 943 b2++;
yading@10 944 }
yading@10 945 }
yading@10 946 pv = put_vector(book, pb, vec);
yading@10 947 if (!pv)
yading@10 948 return AVERROR(EINVAL);
yading@10 949 for (dim = book->ndimensions; dim--; ) {
yading@10 950 coeffs[a1 + b1] -= *pv++;
yading@10 951 if ((a1 += samples) == s) {
yading@10 952 a1 = 0;
yading@10 953 b1++;
yading@10 954 }
yading@10 955 }
yading@10 956 }
yading@10 957 }
yading@10 958 }
yading@10 959 }
yading@10 960 }
yading@10 961 }
yading@10 962 return 0;
yading@10 963 }
yading@10 964
yading@10 965 static int apply_window_and_mdct(vorbis_enc_context *venc,
yading@10 966 float **audio, int samples)
yading@10 967 {
yading@10 968 int i, channel;
yading@10 969 const float * win = venc->win[0];
yading@10 970 int window_len = 1 << (venc->log2_blocksize[0] - 1);
yading@10 971 float n = (float)(1 << venc->log2_blocksize[0]) / 4.;
yading@10 972 // FIXME use dsp
yading@10 973
yading@10 974 if (!venc->have_saved && !samples)
yading@10 975 return 0;
yading@10 976
yading@10 977 if (venc->have_saved) {
yading@10 978 for (channel = 0; channel < venc->channels; channel++)
yading@10 979 memcpy(venc->samples + channel * window_len * 2,
yading@10 980 venc->saved + channel * window_len, sizeof(float) * window_len);
yading@10 981 } else {
yading@10 982 for (channel = 0; channel < venc->channels; channel++)
yading@10 983 memset(venc->samples + channel * window_len * 2, 0,
yading@10 984 sizeof(float) * window_len);
yading@10 985 }
yading@10 986
yading@10 987 if (samples) {
yading@10 988 for (channel = 0; channel < venc->channels; channel++) {
yading@10 989 float * offset = venc->samples + channel*window_len*2 + window_len;
yading@10 990 for (i = 0; i < samples; i++)
yading@10 991 offset[i] = audio[channel][i] / n * win[window_len - i - 1];
yading@10 992 }
yading@10 993 } else {
yading@10 994 for (channel = 0; channel < venc->channels; channel++)
yading@10 995 memset(venc->samples + channel * window_len * 2 + window_len,
yading@10 996 0, sizeof(float) * window_len);
yading@10 997 }
yading@10 998
yading@10 999 for (channel = 0; channel < venc->channels; channel++)
yading@10 1000 venc->mdct[0].mdct_calc(&venc->mdct[0], venc->coeffs + channel * window_len,
yading@10 1001 venc->samples + channel * window_len * 2);
yading@10 1002
yading@10 1003 if (samples) {
yading@10 1004 for (channel = 0; channel < venc->channels; channel++) {
yading@10 1005 float *offset = venc->saved + channel * window_len;
yading@10 1006 for (i = 0; i < samples; i++)
yading@10 1007 offset[i] = audio[channel][i] / n * win[i];
yading@10 1008 }
yading@10 1009 venc->have_saved = 1;
yading@10 1010 } else {
yading@10 1011 venc->have_saved = 0;
yading@10 1012 }
yading@10 1013 return 1;
yading@10 1014 }
yading@10 1015
yading@10 1016 static int vorbis_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
yading@10 1017 const AVFrame *frame, int *got_packet_ptr)
yading@10 1018 {
yading@10 1019 vorbis_enc_context *venc = avctx->priv_data;
yading@10 1020 float **audio = frame ? (float **)frame->extended_data : NULL;
yading@10 1021 int samples = frame ? frame->nb_samples : 0;
yading@10 1022 vorbis_enc_mode *mode;
yading@10 1023 vorbis_enc_mapping *mapping;
yading@10 1024 PutBitContext pb;
yading@10 1025 int i, ret;
yading@10 1026
yading@10 1027 if (!apply_window_and_mdct(venc, audio, samples))
yading@10 1028 return 0;
yading@10 1029 samples = 1 << (venc->log2_blocksize[0] - 1);
yading@10 1030
yading@10 1031 if ((ret = ff_alloc_packet2(avctx, avpkt, 8192)) < 0)
yading@10 1032 return ret;
yading@10 1033
yading@10 1034 init_put_bits(&pb, avpkt->data, avpkt->size);
yading@10 1035
yading@10 1036 if (pb.size_in_bits - put_bits_count(&pb) < 1 + ilog(venc->nmodes - 1)) {
yading@10 1037 av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n");
yading@10 1038 return AVERROR(EINVAL);
yading@10 1039 }
yading@10 1040
yading@10 1041 put_bits(&pb, 1, 0); // magic bit
yading@10 1042
yading@10 1043 put_bits(&pb, ilog(venc->nmodes - 1), 0); // 0 bits, the mode
yading@10 1044
yading@10 1045 mode = &venc->modes[0];
yading@10 1046 mapping = &venc->mappings[mode->mapping];
yading@10 1047 if (mode->blockflag) {
yading@10 1048 put_bits(&pb, 1, 0);
yading@10 1049 put_bits(&pb, 1, 0);
yading@10 1050 }
yading@10 1051
yading@10 1052 for (i = 0; i < venc->channels; i++) {
yading@10 1053 vorbis_enc_floor *fc = &venc->floors[mapping->floor[mapping->mux[i]]];
yading@10 1054 uint16_t posts[MAX_FLOOR_VALUES];
yading@10 1055 floor_fit(venc, fc, &venc->coeffs[i * samples], posts, samples);
yading@10 1056 if (floor_encode(venc, fc, &pb, posts, &venc->floor[i * samples], samples)) {
yading@10 1057 av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n");
yading@10 1058 return AVERROR(EINVAL);
yading@10 1059 }
yading@10 1060 }
yading@10 1061
yading@10 1062 for (i = 0; i < venc->channels * samples; i++)
yading@10 1063 venc->coeffs[i] /= venc->floor[i];
yading@10 1064
yading@10 1065 for (i = 0; i < mapping->coupling_steps; i++) {
yading@10 1066 float *mag = venc->coeffs + mapping->magnitude[i] * samples;
yading@10 1067 float *ang = venc->coeffs + mapping->angle[i] * samples;
yading@10 1068 int j;
yading@10 1069 for (j = 0; j < samples; j++) {
yading@10 1070 float a = ang[j];
yading@10 1071 ang[j] -= mag[j];
yading@10 1072 if (mag[j] > 0)
yading@10 1073 ang[j] = -ang[j];
yading@10 1074 if (ang[j] < 0)
yading@10 1075 mag[j] = a;
yading@10 1076 }
yading@10 1077 }
yading@10 1078
yading@10 1079 if (residue_encode(venc, &venc->residues[mapping->residue[mapping->mux[0]]],
yading@10 1080 &pb, venc->coeffs, samples, venc->channels)) {
yading@10 1081 av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n");
yading@10 1082 return AVERROR(EINVAL);
yading@10 1083 }
yading@10 1084
yading@10 1085 flush_put_bits(&pb);
yading@10 1086 avpkt->size = put_bits_count(&pb) >> 3;
yading@10 1087
yading@10 1088 avpkt->duration = ff_samples_to_time_base(avctx, avctx->frame_size);
yading@10 1089 if (frame) {
yading@10 1090 if (frame->pts != AV_NOPTS_VALUE)
yading@10 1091 avpkt->pts = ff_samples_to_time_base(avctx, frame->pts);
yading@10 1092 } else
yading@10 1093 avpkt->pts = venc->next_pts;
yading@10 1094 if (avpkt->pts != AV_NOPTS_VALUE)
yading@10 1095 venc->next_pts = avpkt->pts + avpkt->duration;
yading@10 1096
yading@10 1097 *got_packet_ptr = 1;
yading@10 1098 return 0;
yading@10 1099 }
yading@10 1100
yading@10 1101
yading@10 1102 static av_cold int vorbis_encode_close(AVCodecContext *avctx)
yading@10 1103 {
yading@10 1104 vorbis_enc_context *venc = avctx->priv_data;
yading@10 1105 int i;
yading@10 1106
yading@10 1107 if (venc->codebooks)
yading@10 1108 for (i = 0; i < venc->ncodebooks; i++) {
yading@10 1109 av_freep(&venc->codebooks[i].lens);
yading@10 1110 av_freep(&venc->codebooks[i].codewords);
yading@10 1111 av_freep(&venc->codebooks[i].quantlist);
yading@10 1112 av_freep(&venc->codebooks[i].dimensions);
yading@10 1113 av_freep(&venc->codebooks[i].pow2);
yading@10 1114 }
yading@10 1115 av_freep(&venc->codebooks);
yading@10 1116
yading@10 1117 if (venc->floors)
yading@10 1118 for (i = 0; i < venc->nfloors; i++) {
yading@10 1119 int j;
yading@10 1120 if (venc->floors[i].classes)
yading@10 1121 for (j = 0; j < venc->floors[i].nclasses; j++)
yading@10 1122 av_freep(&venc->floors[i].classes[j].books);
yading@10 1123 av_freep(&venc->floors[i].classes);
yading@10 1124 av_freep(&venc->floors[i].partition_to_class);
yading@10 1125 av_freep(&venc->floors[i].list);
yading@10 1126 }
yading@10 1127 av_freep(&venc->floors);
yading@10 1128
yading@10 1129 if (venc->residues)
yading@10 1130 for (i = 0; i < venc->nresidues; i++) {
yading@10 1131 av_freep(&venc->residues[i].books);
yading@10 1132 av_freep(&venc->residues[i].maxes);
yading@10 1133 }
yading@10 1134 av_freep(&venc->residues);
yading@10 1135
yading@10 1136 if (venc->mappings)
yading@10 1137 for (i = 0; i < venc->nmappings; i++) {
yading@10 1138 av_freep(&venc->mappings[i].mux);
yading@10 1139 av_freep(&venc->mappings[i].floor);
yading@10 1140 av_freep(&venc->mappings[i].residue);
yading@10 1141 av_freep(&venc->mappings[i].magnitude);
yading@10 1142 av_freep(&venc->mappings[i].angle);
yading@10 1143 }
yading@10 1144 av_freep(&venc->mappings);
yading@10 1145
yading@10 1146 av_freep(&venc->modes);
yading@10 1147
yading@10 1148 av_freep(&venc->saved);
yading@10 1149 av_freep(&venc->samples);
yading@10 1150 av_freep(&venc->floor);
yading@10 1151 av_freep(&venc->coeffs);
yading@10 1152
yading@10 1153 ff_mdct_end(&venc->mdct[0]);
yading@10 1154 ff_mdct_end(&venc->mdct[1]);
yading@10 1155
yading@10 1156 av_freep(&avctx->extradata);
yading@10 1157
yading@10 1158 return 0 ;
yading@10 1159 }
yading@10 1160
yading@10 1161 static av_cold int vorbis_encode_init(AVCodecContext *avctx)
yading@10 1162 {
yading@10 1163 vorbis_enc_context *venc = avctx->priv_data;
yading@10 1164 int ret;
yading@10 1165
yading@10 1166 if (avctx->channels != 2) {
yading@10 1167 av_log(avctx, AV_LOG_ERROR, "Current FFmpeg Vorbis encoder only supports 2 channels.\n");
yading@10 1168 return -1;
yading@10 1169 }
yading@10 1170
yading@10 1171 if ((ret = create_vorbis_context(venc, avctx)) < 0)
yading@10 1172 goto error;
yading@10 1173
yading@10 1174 avctx->bit_rate = 0;
yading@10 1175 if (avctx->flags & CODEC_FLAG_QSCALE)
yading@10 1176 venc->quality = avctx->global_quality / (float)FF_QP2LAMBDA;
yading@10 1177 else
yading@10 1178 venc->quality = 8;
yading@10 1179 venc->quality *= venc->quality;
yading@10 1180
yading@10 1181 if ((ret = put_main_header(venc, (uint8_t**)&avctx->extradata)) < 0)
yading@10 1182 goto error;
yading@10 1183 avctx->extradata_size = ret;
yading@10 1184
yading@10 1185 avctx->frame_size = 1 << (venc->log2_blocksize[0] - 1);
yading@10 1186
yading@10 1187 return 0;
yading@10 1188 error:
yading@10 1189 vorbis_encode_close(avctx);
yading@10 1190 return ret;
yading@10 1191 }
yading@10 1192
yading@10 1193 AVCodec ff_vorbis_encoder = {
yading@10 1194 .name = "vorbis",
yading@10 1195 .type = AVMEDIA_TYPE_AUDIO,
yading@10 1196 .id = AV_CODEC_ID_VORBIS,
yading@10 1197 .priv_data_size = sizeof(vorbis_enc_context),
yading@10 1198 .init = vorbis_encode_init,
yading@10 1199 .encode2 = vorbis_encode_frame,
yading@10 1200 .close = vorbis_encode_close,
yading@10 1201 .capabilities = CODEC_CAP_DELAY | CODEC_CAP_EXPERIMENTAL,
yading@10 1202 .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP,
yading@10 1203 AV_SAMPLE_FMT_NONE },
yading@10 1204 .long_name = NULL_IF_CONFIG_SMALL("Vorbis"),
yading@10 1205 };