vorbis_enc.c 33.8 KB
Newer Older
Oded Shimon's avatar
Oded Shimon committed
1 2 3
/*
 * copyright (c) 2006 Oded Shimon <ods15@ods15.dyndns.org>
 *
4 5 6
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
Oded Shimon's avatar
Oded Shimon committed
7 8
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
9
 * version 2.1 of the License, or (at your option) any later version.
Oded Shimon's avatar
Oded Shimon committed
10
 *
11
 * FFmpeg is distributed in the hope that it will be useful,
Oded Shimon's avatar
Oded Shimon committed
12 13 14 15 16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with FFmpeg; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Oded Shimon's avatar
Oded Shimon committed
19 20 21 22 23 24 25 26
 */

/**
 * @file vorbis_enc.c
 * Native Vorbis encoder.
 * @author Oded Shimon <ods15@ods15.dyndns.org>
 */

27
#include <float.h>
Oded Shimon's avatar
Oded Shimon committed
28
#include "avcodec.h"
29
#include "dsputil.h"
30
#include "vorbis.h"
31
#include "vorbis_enc_data.h"
32

Oded Shimon's avatar
Oded Shimon committed
33 34 35
#undef NDEBUG
#include <assert.h>

36 37
typedef struct {
    int nentries;
38 39
    uint8_t * lens;
    uint32_t * codewords;
40 41 42 43 44 45
    int ndimentions;
    float min;
    float delta;
    int seq_p;
    int lookup;
    int * quantlist;
46
    float * dimentions;
47
    float * pow2;
48 49
} codebook_t;

50
typedef struct {
51 52 53 54 55 56 57 58 59 60 61 62 63 64
    int dim;
    int subclass;
    int masterbook;
    int * books;
} floor_class_t;

typedef struct {
    int partitions;
    int * partition_to_class;
    int nclasses;
    floor_class_t * classes;
    int multiplier;
    int rangebits;
    int values;
65
    floor1_entry_t * list;
66 67 68
} floor_t;

typedef struct {
69 70 71 72 73 74
    int type;
    int begin;
    int end;
    int partition_size;
    int classifications;
    int classbook;
75
    int8_t (*books)[8];
76
    float (*maxes)[2];
77 78 79
} residue_t;

typedef struct {
80 81 82 83
    int submaps;
    int * mux;
    int * floor;
    int * residue;
84 85 86
    int coupling_steps;
    int * magnitude;
    int * angle;
87 88
} mapping_t;

89 90 91 92 93
typedef struct {
    int blockflag;
    int mapping;
} vorbis_mode_t;

94
typedef struct {
95 96
    int channels;
    int sample_rate;
97
    int log2_blocksize[2];
98 99
    MDCTContext mdct[2];
    const float * win[2];
100
    int have_saved;
101 102 103 104
    float * saved;
    float * samples;
    float * floor; // also used for tmp values for mdct
    float * coeffs; // also used for residue after floor
105
    float quality;
106

107 108
    int ncodebooks;
    codebook_t * codebooks;
109 110 111 112 113 114 115 116 117

    int nfloors;
    floor_t * floors;

    int nresidues;
    residue_t * residues;

    int nmappings;
    mapping_t * mappings;
118 119 120

    int nmodes;
    vorbis_mode_t * modes;
Oded Shimon's avatar
Oded Shimon committed
121 122
} venc_context_t;

123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
typedef struct {
    int total;
    int total_pos;
    int pos;
    uint8_t * buf_ptr;
} PutBitContext;

static inline void init_put_bits(PutBitContext * pb, uint8_t * buf, int buffer_len) {
    pb->total = buffer_len * 8;
    pb->total_pos = 0;
    pb->pos = 0;
    pb->buf_ptr = buf;
}

static void put_bits(PutBitContext * pb, int bits, uint64_t val) {
    if ((pb->total_pos += bits) >= pb->total) return;
    if (!bits) return;
    if (pb->pos) {
        if (pb->pos > bits) {
            *pb->buf_ptr |= val << (8 - pb->pos);
            pb->pos -= bits;
            bits = 0;
        } else {
            *pb->buf_ptr++ |= (val << (8 - pb->pos)) & 0xFF;
            val >>= pb->pos;
            bits -= pb->pos;
            pb->pos = 0;
        }
    }
    for (; bits >= 8; bits -= 8) {
        *pb->buf_ptr++ = val & 0xFF;
        val >>= 8;
    }
    if (bits) {
        *pb->buf_ptr = val;
        pb->pos = 8 - bits;
    }
}

static inline void flush_put_bits(PutBitContext * pb) {
}

static inline int put_bits_count(PutBitContext * pb) {
    return pb->total_pos;
}

169 170 171 172 173 174 175
static inline void put_codeword(PutBitContext * pb, codebook_t * cb, int entry) {
    assert(entry >= 0);
    assert(entry < cb->nentries);
    assert(cb->lens[entry]);
    put_bits(pb, cb->lens[entry], cb->codewords[entry]);
}

176
static int cb_lookup_vals(int lookup, int dimentions, int entries) {
177
    if      (lookup == 1) return ff_vorbis_nth_root(entries, dimentions);
178
    else if (lookup == 2) return dimentions * entries;
179 180 181 182 183 184
    return 0;
}

static void ready_codebook(codebook_t * cb) {
    int i;

185
    ff_vorbis_len2vlc(cb->lens, cb->codewords, cb->nentries);
186

187 188
    if (!cb->lookup)
        cb->pow2 = cb->dimentions = NULL;
189 190 191
    else {
        int vals = cb_lookup_vals(cb->lookup, cb->ndimentions, cb->nentries);
        cb->dimentions = av_malloc(sizeof(float) * cb->nentries * cb->ndimentions);
192
        cb->pow2 = av_mallocz(sizeof(float) * cb->nentries);
193 194 195 196 197 198
        for (i = 0; i < cb->nentries; i++) {
            float last = 0;
            int j;
            int div = 1;
            for (j = 0; j < cb->ndimentions; j++) {
                int off;
199 200 201 202
                if (cb->lookup == 1)
                    off = (i / div) % vals; // lookup type 1
                else
                    off = i * cb->ndimentions + j; // lookup type 2
203 204

                cb->dimentions[i * cb->ndimentions + j] = last + cb->min + cb->quantlist[off] * cb->delta;
205 206
                if (cb->seq_p)
                    last = cb->dimentions[i * cb->ndimentions + j];
207
                cb->pow2[i] += cb->dimentions[i * cb->ndimentions + j]*cb->dimentions[i * cb->ndimentions + j];
208 209
                div *= vals;
            }
210
            cb->pow2[i] /= 2.;
211 212 213 214
        }
    }
}

215 216 217 218 219 220 221
static void ready_residue(residue_t * rc, venc_context_t * venc) {
    int i;
    assert(rc->type == 2);
    rc->maxes = av_mallocz(sizeof(float[2]) * rc->classifications);
    for (i = 0; i < rc->classifications; i++) {
        int j;
        codebook_t * cb;
222 223
        for (j = 0; j < 8; j++)
            if (rc->books[i][j] != -1) break;
224 225 226 227 228 229 230
        if (j == 8) continue; // zero
        cb = &venc->codebooks[rc->books[i][j]];
        assert(cb->ndimentions >= 2);
        assert(cb->lookup);

        for (j = 0; j < cb->nentries; j++) {
            float a;
231
            if (!cb->lens[j]) continue;
232
            a = fabs(cb->dimentions[j * cb->ndimentions]);
233 234
            if (a > rc->maxes[i][0])
                rc->maxes[i][0] = a;
235
            a = fabs(cb->dimentions[j * cb->ndimentions + 1]);
236 237
            if (a > rc->maxes[i][1])
                rc->maxes[i][1] = a;
238 239 240 241 242 243 244 245 246
        }
    }
    // small bias
    for (i = 0; i < rc->classifications; i++) {
        rc->maxes[i][0] += 0.8;
        rc->maxes[i][1] += 0.8;
    }
}

247
static void create_vorbis_context(venc_context_t * venc, AVCodecContext * avccontext) {
248
    floor_t * fc;
249
    residue_t * rc;
250
    mapping_t * mc;
251
    int i, book;
252

253 254
    venc->channels = avccontext->channels;
    venc->sample_rate = avccontext->sample_rate;
255
    venc->log2_blocksize[0] = venc->log2_blocksize[1] = 11;
256

257
    venc->ncodebooks = sizeof(cvectors)/sizeof(cvectors[0]);
258 259
    venc->codebooks = av_malloc(sizeof(codebook_t) * venc->ncodebooks);

260
    // codebook 0..14 - floor1 book, values 0..255
261 262 263
    // codebook 15 residue masterbook
    // codebook 16..29 residue
    for (book = 0; book < venc->ncodebooks; book++) {
264 265 266 267 268 269 270 271
        codebook_t * cb = &venc->codebooks[book];
        int vals;
        cb->ndimentions = cvectors[book].dim;
        cb->nentries = cvectors[book].real_len;
        cb->min = cvectors[book].min;
        cb->delta = cvectors[book].delta;
        cb->lookup = cvectors[book].lookup;
        cb->seq_p = 0;
272 273 274 275 276 277

        cb->lens = av_malloc(sizeof(uint8_t) * cb->nentries);
        cb->codewords = av_malloc(sizeof(uint32_t) * cb->nentries);
        memcpy(cb->lens, cvectors[book].clens, cvectors[book].len);
        memset(cb->lens + cvectors[book].len, 0, cb->nentries - cvectors[book].len);

278 279 280
        if (cb->lookup) {
            vals = cb_lookup_vals(cb->lookup, cb->ndimentions, cb->nentries);
            cb->quantlist = av_malloc(sizeof(int) * vals);
281 282
            for (i = 0; i < vals; i++)
                cb->quantlist[i] = cvectors[book].quant[i];
283 284 285
        } else {
            cb->quantlist = NULL;
        }
286 287
        ready_codebook(cb);
    }
288

289 290 291
    venc->nfloors = 1;
    venc->floors = av_malloc(sizeof(floor_t) * venc->nfloors);

292 293
    // just 1 floor
    fc = &venc->floors[0];
294
    fc->partitions = 8;
295
    fc->partition_to_class = av_malloc(sizeof(int) * fc->partitions);
296 297
    fc->nclasses = 0;
    for (i = 0; i < fc->partitions; i++) {
298
        static const int a[] = {0,1,2,2,3,3,4,4};
299 300 301 302
        fc->partition_to_class[i] = a[i];
        fc->nclasses = FFMAX(fc->nclasses, fc->partition_to_class[i]);
    }
    fc->nclasses++;
303 304 305 306
    fc->classes = av_malloc(sizeof(floor_class_t) * fc->nclasses);
    for (i = 0; i < fc->nclasses; i++) {
        floor_class_t * c = &fc->classes[i];
        int j, books;
307 308 309
        c->dim = floor_classes[i].dim;
        c->subclass = floor_classes[i].subclass;
        c->masterbook = floor_classes[i].masterbook;
310 311
        books = (1 << c->subclass);
        c->books = av_malloc(sizeof(int) * books);
312 313
        for (j = 0; j < books; j++)
            c->books[j] = floor_classes[i].nbooks[j];
314
    }
315
    fc->multiplier = 2;
316
    fc->rangebits = venc->log2_blocksize[0] - 1;
317 318 319 320 321

    fc->values = 2;
    for (i = 0; i < fc->partitions; i++)
        fc->values += fc->classes[fc->partition_to_class[i]].dim;

322
    fc->list = av_malloc(sizeof(floor1_entry_t) * fc->values);
323 324
    fc->list[0].x = 0;
    fc->list[1].x = 1 << fc->rangebits;
325
    for (i = 2; i < fc->values; i++) {
326 327 328 329 330
        static const int a[] = {
             93, 23,372,  6, 46,186,750, 14, 33, 65,
            130,260,556,  3, 10, 18, 28, 39, 55, 79,
            111,158,220,312,464,650,850
        };
331
        fc->list[i].x = a[i - 2];
332
    }
333
    ff_vorbis_ready_floor1_list(fc->list, fc->values);
334 335 336 337

    venc->nresidues = 1;
    venc->residues = av_malloc(sizeof(residue_t) * venc->nresidues);

338 339
    // single residue
    rc = &venc->residues[0];
340
    rc->type = 2;
341
    rc->begin = 0;
342 343 344
    rc->end = 1600;
    rc->partition_size = 32;
    rc->classifications = 10;
345
    rc->classbook = 15;
346 347 348
    rc->books = av_malloc(sizeof(*rc->books) * rc->classifications);
    {
        static const int8_t a[10][8] = {
349 350 351 352 353 354 355 356 357 358 359
            { -1, -1, -1, -1, -1, -1, -1, -1, },
            { -1, -1, 16, -1, -1, -1, -1, -1, },
            { -1, -1, 17, -1, -1, -1, -1, -1, },
            { -1, -1, 18, -1, -1, -1, -1, -1, },
            { -1, -1, 19, -1, -1, -1, -1, -1, },
            { -1, -1, 20, -1, -1, -1, -1, -1, },
            { -1, -1, 21, -1, -1, -1, -1, -1, },
            { 22, 23, -1, -1, -1, -1, -1, -1, },
            { 24, 25, -1, -1, -1, -1, -1, -1, },
            { 26, 27, 28, -1, -1, -1, -1, -1, },
        };
360
        memcpy(rc->books, a, sizeof a);
361
    }
362
    ready_residue(rc, venc);
363

364 365 366
    venc->nmappings = 1;
    venc->mappings = av_malloc(sizeof(mapping_t) * venc->nmappings);

367 368 369 370
    // single mapping
    mc = &venc->mappings[0];
    mc->submaps = 1;
    mc->mux = av_malloc(sizeof(int) * venc->channels);
371 372
    for (i = 0; i < venc->channels; i++)
        mc->mux[i] = 0;
373 374 375 376 377 378
    mc->floor = av_malloc(sizeof(int) * mc->submaps);
    mc->residue = av_malloc(sizeof(int) * mc->submaps);
    for (i = 0; i < mc->submaps; i++) {
        mc->floor[i] = 0;
        mc->residue[i] = 0;
    }
379 380 381 382 383 384 385
    mc->coupling_steps = venc->channels == 2 ? 1 : 0;
    mc->magnitude = av_malloc(sizeof(int) * mc->coupling_steps);
    mc->angle = av_malloc(sizeof(int) * mc->coupling_steps);
    if (mc->coupling_steps) {
        mc->magnitude[0] = 0;
        mc->angle[0] = 1;
    }
386

387 388
    venc->nmodes = 1;
    venc->modes = av_malloc(sizeof(vorbis_mode_t) * venc->nmodes);
389 390 391 392

    // single mode
    venc->modes[0].blockflag = 0;
    venc->modes[0].mapping = 0;
393

394
    venc->have_saved = 0;
395 396 397 398
    venc->saved = av_malloc(sizeof(float) * venc->channels * (1 << venc->log2_blocksize[1]) / 2);
    venc->samples = av_malloc(sizeof(float) * venc->channels * (1 << venc->log2_blocksize[1]));
    venc->floor = av_malloc(sizeof(float) * venc->channels * (1 << venc->log2_blocksize[1]) / 2);
    venc->coeffs = av_malloc(sizeof(float) * venc->channels * (1 << venc->log2_blocksize[1]) / 2);
399

400 401
    venc->win[0] = ff_vorbis_vwin[venc->log2_blocksize[0] - 6];
    venc->win[1] = ff_vorbis_vwin[venc->log2_blocksize[1] - 6];
402

403 404
    ff_mdct_init(&venc->mdct[0], venc->log2_blocksize[0], 0);
    ff_mdct_init(&venc->mdct[1], venc->log2_blocksize[1], 0);
405 406
}

407
static void put_float(PutBitContext * pb, float f) {
408 409 410 411 412 413 414
    int exp, mant;
    uint32_t res = 0;
    mant = (int)ldexp(frexp(f, &exp), 20);
    exp += 788 - 20;
    if (mant < 0) { res |= (1 << 31); mant = -mant; }
    res |= mant | (exp << 21);
    put_bits(pb, 32, res);
415 416
}

417 418 419 420 421 422 423 424
static void put_codebook_header(PutBitContext * pb, codebook_t * cb) {
    int i;
    int ordered = 0;

    put_bits(pb, 24, 0x564342); //magic
    put_bits(pb, 16, cb->ndimentions);
    put_bits(pb, 24, cb->nentries);

425 426 427 428
    for (i = 1; i < cb->nentries; i++)
        if (cb->lens[i] < cb->lens[i-1]) break;
    if (i == cb->nentries)
        ordered = 1;
429 430 431

    put_bits(pb, 1, ordered);
    if (ordered) {
432
        int len = cb->lens[0];
433
        put_bits(pb, 5, len - 1);
434 435
        i = 0;
        while (i < cb->nentries) {
436
            int j;
437 438
            for (j = 0; j+i < cb->nentries; j++)
                if (cb->lens[j+i] != len) break;
439
            put_bits(pb, ilog(cb->nentries - i), j);
440 441 442 443 444
            i += j;
            len++;
        }
    } else {
        int sparse = 0;
445 446 447 448
        for (i = 0; i < cb->nentries; i++)
            if (!cb->lens[i]) break;
        if (i != cb->nentries)
            sparse = 1;
449 450 451
        put_bits(pb, 1, sparse);

        for (i = 0; i < cb->nentries; i++) {
452 453
            if (sparse) put_bits(pb, 1, !!cb->lens[i]);
            if (cb->lens[i]) put_bits(pb, 5, cb->lens[i] - 1);
454 455 456 457 458
        }
    }

    put_bits(pb, 4, cb->lookup);
    if (cb->lookup) {
459 460
        int tmp = cb_lookup_vals(cb->lookup, cb->ndimentions, cb->nentries);
        int bits = ilog(cb->quantlist[0]);
461

462 463
        for (i = 1; i < tmp; i++)
            bits = FFMAX(bits, ilog(cb->quantlist[i]));
464

465 466
        put_float(pb, cb->min);
        put_float(pb, cb->delta);
467

468 469
        put_bits(pb, 4, bits - 1);
        put_bits(pb, 1, cb->seq_p);
470

471 472
        for (i = 0; i < tmp; i++)
            put_bits(pb, bits, cb->quantlist[i]);
473 474 475
    }
}

476 477 478 479 480 481 482
static void put_floor_header(PutBitContext * pb, floor_t * fc) {
    int i;

    put_bits(pb, 16, 1); // type, only floor1 is supported

    put_bits(pb, 5, fc->partitions);

483 484
    for (i = 0; i < fc->partitions; i++)
        put_bits(pb, 4, fc->partition_to_class[i]);
485 486 487 488 489 490 491

    for (i = 0; i < fc->nclasses; i++) {
        int j, books;

        put_bits(pb, 3, fc->classes[i].dim - 1);
        put_bits(pb, 2, fc->classes[i].subclass);

492 493
        if (fc->classes[i].subclass)
            put_bits(pb, 8, fc->classes[i].masterbook);
494 495 496

        books = (1 << fc->classes[i].subclass);

497 498
        for (j = 0; j < books; j++)
            put_bits(pb, 8, fc->classes[i].books[j] + 1);
499 500 501 502 503
    }

    put_bits(pb, 2, fc->multiplier - 1);
    put_bits(pb, 4, fc->rangebits);

504 505
    for (i = 2; i < fc->values; i++)
        put_bits(pb, fc->rangebits, fc->list[i].x);
506 507
}

508
static void put_residue_header(PutBitContext * pb, residue_t * rc) {
509 510 511 512 513 514 515
    int i;

    put_bits(pb, 16, rc->type);

    put_bits(pb, 24, rc->begin);
    put_bits(pb, 24, rc->end);
    put_bits(pb, 24, rc->partition_size - 1);
516
    put_bits(pb, 6, rc->classifications - 1);
517 518 519 520
    put_bits(pb, 8, rc->classbook);

    for (i = 0; i < rc->classifications; i++) {
        int j, tmp = 0;
521 522
        for (j = 0; j < 8; j++)
            tmp |= (rc->books[i][j] != -1) << j;
523 524 525 526

        put_bits(pb, 3, tmp & 7);
        put_bits(pb, 1, tmp > 7);

527 528
        if (tmp > 7)
            put_bits(pb, 5, tmp >> 3);
529 530 531 532 533
    }

    for (i = 0; i < rc->classifications; i++) {
        int j;
        for (j = 0; j < 8; j++)
534
            if (rc->books[i][j] != -1)
535 536
                put_bits(pb, 8, rc->books[i][j]);
    }
537 538
}

539
static int put_main_header(venc_context_t * venc, uint8_t ** out) {
540
    int i;
541 542 543 544 545 546 547 548
    PutBitContext pb;
    uint8_t buffer[50000] = {0}, * p = buffer;
    int buffer_len = sizeof buffer;
    int len, hlens[3];

    // identification header
    init_put_bits(&pb, p, buffer_len);
    put_bits(&pb, 8, 1); //magic
549 550
    for (i = 0; "vorbis"[i]; i++)
        put_bits(&pb, 8, "vorbis"[i]);
551 552 553 554 555 556
    put_bits(&pb, 32, 0); // version
    put_bits(&pb, 8, venc->channels);
    put_bits(&pb, 32, venc->sample_rate);
    put_bits(&pb, 32, 0); // bitrate
    put_bits(&pb, 32, 0); // bitrate
    put_bits(&pb, 32, 0); // bitrate
557 558
    put_bits(&pb, 4, venc->log2_blocksize[0]);
    put_bits(&pb, 4, venc->log2_blocksize[1]);
559 560 561 562 563 564 565 566 567 568
    put_bits(&pb, 1, 1); // framing

    flush_put_bits(&pb);
    hlens[0] = (put_bits_count(&pb) + 7) / 8;
    buffer_len -= hlens[0];
    p += hlens[0];

    // comment header
    init_put_bits(&pb, p, buffer_len);
    put_bits(&pb, 8, 3); //magic
569 570
    for (i = 0; "vorbis"[i]; i++)
        put_bits(&pb, 8, "vorbis"[i]);
571 572 573 574 575 576 577 578 579 580 581 582
    put_bits(&pb, 32, 0); // vendor length TODO
    put_bits(&pb, 32, 0); // amount of comments
    put_bits(&pb, 1, 1); // framing

    flush_put_bits(&pb);
    hlens[1] = (put_bits_count(&pb) + 7) / 8;
    buffer_len -= hlens[1];
    p += hlens[1];

    // setup header
    init_put_bits(&pb, p, buffer_len);
    put_bits(&pb, 8, 5); //magic
583 584
    for (i = 0; "vorbis"[i]; i++)
        put_bits(&pb, 8, "vorbis"[i]);
585 586 587

    // codebooks
    put_bits(&pb, 8, venc->ncodebooks - 1);
588 589
    for (i = 0; i < venc->ncodebooks; i++)
        put_codebook_header(&pb, &venc->codebooks[i]);
590

591 592 593 594 595 596
    // time domain, reserved, zero
    put_bits(&pb, 6, 0);
    put_bits(&pb, 16, 0);

    // floors
    put_bits(&pb, 6, venc->nfloors - 1);
597 598
    for (i = 0; i < venc->nfloors; i++)
        put_floor_header(&pb, &venc->floors[i]);
599 600 601

    // residues
    put_bits(&pb, 6, venc->nresidues - 1);
602 603
    for (i = 0; i < venc->nresidues; i++)
        put_residue_header(&pb, &venc->residues[i]);
604 605 606 607

    // mappings
    put_bits(&pb, 6, venc->nmappings - 1);
    for (i = 0; i < venc->nmappings; i++) {
608 609 610 611 612
        mapping_t * mc = &venc->mappings[i];
        int j;
        put_bits(&pb, 16, 0); // mapping type

        put_bits(&pb, 1, mc->submaps > 1);
613 614
        if (mc->submaps > 1)
            put_bits(&pb, 4, mc->submaps - 1);
615

616 617 618 619 620 621 622 623
        put_bits(&pb, 1, !!mc->coupling_steps);
        if (mc->coupling_steps) {
            put_bits(&pb, 8, mc->coupling_steps - 1);
            for (j = 0; j < mc->coupling_steps; j++) {
                put_bits(&pb, ilog(venc->channels - 1), mc->magnitude[j]);
                put_bits(&pb, ilog(venc->channels - 1), mc->angle[j]);
            }
        }
624 625 626

        put_bits(&pb, 2, 0); // reserved

627 628 629
        if (mc->submaps > 1)
            for (j = 0; j < venc->channels; j++)
                put_bits(&pb, 4, mc->mux[j]);
630 631 632 633 634 635

        for (j = 0; j < mc->submaps; j++) {
            put_bits(&pb, 8, 0); // reserved time configuration
            put_bits(&pb, 8, mc->floor[j]);
            put_bits(&pb, 8, mc->residue[j]);
        }
636
    }
637

638 639 640 641 642 643 644 645 646
    // modes
    put_bits(&pb, 6, venc->nmodes - 1);
    for (i = 0; i < venc->nmodes; i++) {
        put_bits(&pb, 1, venc->modes[i].blockflag);
        put_bits(&pb, 16, 0); // reserved window type
        put_bits(&pb, 16, 0); // reserved transform type
        put_bits(&pb, 8, venc->modes[i].mapping);
    }

647 648
    put_bits(&pb, 1, 1); // framing

649 650 651 652 653 654 655 656 657 658 659 660 661 662 663
    flush_put_bits(&pb);
    hlens[2] = (put_bits_count(&pb) + 7) / 8;

    len = hlens[0] + hlens[1] + hlens[2];
    p = *out = av_mallocz(64 + len + len/255);

    *p++ = 2;
    p += av_xiphlacing(p, hlens[0]);
    p += av_xiphlacing(p, hlens[1]);
    buffer_len = 0;
    for (i = 0; i < 3; i++) {
        memcpy(p, buffer + buffer_len, hlens[i]);
        p += hlens[i];
        buffer_len += hlens[i];
    }
664

665
    return p - *out;
666 667
}

668 669 670 671 672 673
static float get_floor_average(floor_t * fc, float * coeffs, int i) {
    int begin = fc->list[fc->list[FFMAX(i-1, 0)].sort].x;
    int end   = fc->list[fc->list[FFMIN(i+1, fc->values - 1)].sort].x;
    int j;
    float average = 0;

674 675
    for (j = begin; j < end; j++)
        average += fabs(coeffs[j]);
676 677 678
    return average / (end - begin);
}

679
static void floor_fit(venc_context_t * venc, floor_t * fc, float * coeffs, uint_fast16_t * posts, int samples) {
680 681
    int range = 255 / fc->multiplier + 1;
    int i;
682
    float tot_average = 0.;
683
    float averages[fc->values];
684 685 686 687
    for (i = 0; i < fc->values; i++){
        averages[i] = get_floor_average(fc, coeffs, i);
        tot_average += averages[i];
    }
688
    tot_average /= fc->values;
689
    tot_average /= venc->quality;
690

691 692
    for (i = 0; i < fc->values; i++) {
        int position = fc->list[fc->list[i].sort].x;
693
        float average = averages[i];
694 695
        int j;

696
        average *= pow(tot_average / average, 0.5) * pow(1.25, position/200.); // MAGIC!
697 698
        for (j = 0; j < range - 1; j++)
            if (ff_vorbis_floor1_inverse_db_table[j * fc->multiplier] > average) break;
699 700 701 702
        posts[fc->list[i].sort] = j;
    }
}

703 704 705 706
static int render_point(int x0, int y0, int x1, int y1, int x) {
    return y0 +  (x - x0) * (y1 - y0) / (x1 - x0);
}

707
static void floor_encode(venc_context_t * venc, floor_t * fc, PutBitContext * pb, uint_fast16_t * posts, float * floor, int samples) {
708
    int range = 255 / fc->multiplier + 1;
709 710 711
    int coded[fc->values]; // first 2 values are unused
    int i, counter;

712
    put_bits(pb, 1, 1); // non zero
713 714
    put_bits(pb, ilog(range - 1), posts[0]);
    put_bits(pb, ilog(range - 1), posts[1]);
715
    coded[0] = coded[1] = 1;
716 717 718 719 720 721 722

    for (i = 2; i < fc->values; i++) {
        int predicted = render_point(fc->list[fc->list[i].low].x,
                                     posts[fc->list[i].low],
                                     fc->list[fc->list[i].high].x,
                                     posts[fc->list[i].high],
                                     fc->list[i].x);
723
        int highroom = range - predicted;
724 725 726 727 728
        int lowroom = predicted;
        int room = FFMIN(highroom, lowroom);
        if (predicted == posts[i]) {
            coded[i] = 0; // must be used later as flag!
            continue;
729
        } else {
730
            if (!coded[fc->list[i].low ]) coded[fc->list[i].low ] = -1;
731
            if (!coded[fc->list[i].high]) coded[fc->list[i].high] = -1;
732 733
        }
        if (posts[i] > predicted) {
734 735 736 737
            if (posts[i] - predicted > room)
                coded[i] = posts[i] - predicted + lowroom;
            else
                coded[i] = (posts[i] - predicted) << 1;
738
        } else {
739 740 741 742
            if (predicted - posts[i] > room)
                coded[i] = predicted - posts[i] + highroom - 1;
            else
                coded[i] = ((predicted - posts[i]) << 1) - 1;
743 744 745 746 747 748
        }
    }

    counter = 2;
    for (i = 0; i < fc->partitions; i++) {
        floor_class_t * c = &fc->classes[fc->partition_to_class[i]];
749 750 751 752 753 754 755 756
        int k, cval = 0, csub = 1<<c->subclass;
        if (c->subclass) {
            codebook_t * book = &venc->codebooks[c->masterbook];
            int cshift = 0;
            for (k = 0; k < c->dim; k++) {
                int l;
                for (l = 0; l < csub; l++) {
                    int maxval = 1;
757 758
                    if (c->books[l] != -1)
                        maxval = venc->codebooks[c->books[l]].nentries;
Diego Biurrun's avatar
Diego Biurrun committed
759
                    // coded could be -1, but this still works, cause that is 0
760 761 762 763 764 765
                    if (coded[counter + k] < maxval) break;
                }
                assert(l != csub);
                cval |= l << cshift;
                cshift += c->subclass;
            }
766
            put_codeword(pb, book, cval);
767
        }
768
        for (k = 0; k < c->dim; k++) {
769
            int book = c->books[cval & (csub-1)];
770
            int entry = coded[counter++];
771
            cval >>= c->subclass;
772
            if (book == -1) continue;
773
            if (entry == -1) entry = 0;
774
            put_codeword(pb, &venc->codebooks[book], entry);
775 776 777
        }
    }

778
    ff_vorbis_floor1_render_list(fc->list, fc->values, posts, coded, fc->multiplier, floor, samples);
779 780
}

781
static float * put_vector(codebook_t * book, PutBitContext * pb, float * num) {
782 783
    int i, entry = -1;
    float distance = FLT_MAX;
784 785
    assert(book->dimentions);
    for (i = 0; i < book->nentries; i++) {
786
        float * vec = book->dimentions + i * book->ndimentions, d = book->pow2[i];
787
        int j;
788
        if (!book->lens[i]) continue;
789 790
        for (j = 0; j < book->ndimentions; j++)
            d -= vec[j] * num[j];
791
        if (distance > d) {
792 793 794 795
            entry = i;
            distance = d;
        }
    }
796
    put_codeword(pb, book, entry);
797 798
    return &book->dimentions[entry * book->ndimentions];
}
Oded Shimon's avatar
Oded Shimon committed
799

800
static void residue_encode(venc_context_t * venc, residue_t * rc, PutBitContext * pb, float * coeffs, int samples, int real_ch) {
801 802 803
    int pass, i, j, p, k;
    int psize = rc->partition_size;
    int partitions = (rc->end - rc->begin) / psize;
804
    int channels = (rc->type == 2) ? 1 : real_ch;
805 806
    int classes[channels][partitions];
    int classwords = venc->codebooks[rc->classbook].ndimentions;
807

808 809 810 811 812 813
    assert(rc->type == 2);
    assert(real_ch == 2);
    for (p = 0; p < partitions; p++) {
        float max1 = 0., max2 = 0.;
        int s = rc->begin + p * psize;
        for (k = s; k < s + psize; k += 2) {
814 815
            max1 = FFMAX(max1, fabs(coeffs[          k / real_ch]));
            max2 = FFMAX(max2, fabs(coeffs[samples + k / real_ch]));
816 817 818 819 820 821 822 823
        }

        for (i = 0; i < rc->classifications - 1; i++) {
            if (max1 < rc->maxes[i][0] && max2 < rc->maxes[i][1]) break;
        }
        classes[0][p] = i;
    }

824 825 826
    for (pass = 0; pass < 8; pass++) {
        p = 0;
        while (p < partitions) {
827 828 829 830 831 832 833 834 835
            if (pass == 0)
                for (j = 0; j < channels; j++) {
                    codebook_t * book = &venc->codebooks[rc->classbook];
                    int entry = 0;
                    for (i = 0; i < classwords; i++) {
                        entry *= rc->classifications;
                        entry += classes[j][p + i];
                    }
                    put_codeword(pb, book, entry);
836 837 838 839 840 841 842
                }
            for (i = 0; i < classwords && p < partitions; i++, p++) {
                for (j = 0; j < channels; j++) {
                    int nbook = rc->books[classes[j][p]][pass];
                    codebook_t * book = &venc->codebooks[nbook];
                    float * buf = coeffs + samples*j + rc->begin + p*psize;
                    if (nbook == -1) continue;
Oded Shimon's avatar
Oded Shimon committed
843

844
                    assert(rc->type == 0 || rc->type == 2);
845
                    assert(!(psize % book->ndimentions));
Oded Shimon's avatar
Oded Shimon committed
846

847
                    if (rc->type == 0) {
848 849 850
                        for (k = 0; k < psize; k += book->ndimentions) {
                            float * a = put_vector(book, pb, &buf[k]);
                            int l;
851 852
                            for (l = 0; l < book->ndimentions; l++)
                                buf[k + l] -= a[l];
853
                        }
854
                    } else {
855 856 857 858
                        int s = rc->begin + p * psize, a1, b1;
                        a1 = (s % real_ch) * samples;
                        b1 =  s / real_ch;
                        s = real_ch * samples;
859
                        for (k = 0; k < psize; k += book->ndimentions) {
860 861 862 863
                            int dim, a2 = a1, b2 = b1;
                            float vec[book->ndimentions], * pv = vec;
                            for (dim = book->ndimentions; dim--; ) {
                                *pv++ = coeffs[a2 + b2];
864 865 866 867
                                if ((a2 += samples) == s) {
                                    a2=0;
                                    b2++;
                                }
868 869 870 871
                            }
                            pv = put_vector(book, pb, vec);
                            for (dim = book->ndimentions; dim--; ) {
                                coeffs[a1 + b1] -= *pv++;
872 873 874 875
                                if ((a1 += samples) == s) {
                                    a1=0;
                                    b1++;
                                }
876
                            }
877 878
                        }
                    }
879 880 881 882
                }
            }
        }
    }
Oded Shimon's avatar
Oded Shimon committed
883 884
}

885
static int apply_window_and_mdct(venc_context_t * venc, signed short * audio, int samples) {
886 887
    int i, j, channel;
    const float * win = venc->win[0];
888 889
    int window_len = 1 << (venc->log2_blocksize[0] - 1);
    float n = (float)(1 << venc->log2_blocksize[0]) / 4.;
890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905
    // FIXME use dsp

    if (!venc->have_saved && !samples) return 0;

    if (venc->have_saved) {
        for (channel = 0; channel < venc->channels; channel++) {
            memcpy(venc->samples + channel*window_len*2, venc->saved + channel*window_len, sizeof(float)*window_len);
        }
    } else {
        for (channel = 0; channel < venc->channels; channel++) {
            memset(venc->samples + channel*window_len*2, 0, sizeof(float)*window_len);
        }
    }

    if (samples) {
        for (channel = 0; channel < venc->channels; channel++) {
906
            float * offset = venc->samples + channel*window_len*2 + window_len;
907 908
            j = channel;
            for (i = 0; i < samples; i++, j += venc->channels)
909
                offset[i] = -audio[j] / 32768. / n * win[window_len - i - 1]; //FIXME find out why the sign has to be fliped
910 911 912 913 914 915 916 917 918 919 920 921 922
        }
    } else {
        for (channel = 0; channel < venc->channels; channel++) {
            memset(venc->samples + channel*window_len*2 + window_len, 0, sizeof(float)*window_len);
        }
    }

    for (channel = 0; channel < venc->channels; channel++) {
        ff_mdct_calc(&venc->mdct[0], venc->coeffs + channel*window_len, venc->samples + channel*window_len*2, venc->floor/*tmp*/);
    }

    if (samples) {
        for (channel = 0; channel < venc->channels; channel++) {
923
            float * offset = venc->saved + channel*window_len;
924 925
            j = channel;
            for (i = 0; i < samples; i++, j += venc->channels)
926
                offset[i] = -audio[j] / 32768. / n * win[i]; //FIXME find out why the sign has to be fliped
927 928 929 930 931 932 933
        }
        venc->have_saved = 1;
    } else {
        venc->have_saved = 0;
    }
    return 1;
}
Oded Shimon's avatar
Oded Shimon committed
934

935 936 937
static int vorbis_encode_init(AVCodecContext * avccontext)
{
    venc_context_t * venc = avccontext->priv_data;
938

939 940 941 942
    if (avccontext->channels != 2) {
        av_log(avccontext, AV_LOG_ERROR, "Current FFmpeg Vorbis encoder only supports 2 channels.\n");
        return -1;
    }
943

944
    create_vorbis_context(venc, avccontext);
945

946 947 948 949
    if (avccontext->flags & CODEC_FLAG_QSCALE)
        venc->quality = avccontext->global_quality / (float)FF_QP2LAMBDA / 10.;
    else
        venc->quality = 1.;
950
    venc->quality *= venc->quality;
951

952
    avccontext->extradata_size = put_main_header(venc, (uint8_t**)&avccontext->extradata);
953

954
    avccontext->frame_size = 1 << (venc->log2_blocksize[0] - 1);
955 956 957 958 959

    avccontext->coded_frame = avcodec_alloc_frame();
    avccontext->coded_frame->key_frame = 1;

    return 0;
960 961
}

Oded Shimon's avatar
Oded Shimon committed
962 963 964 965
static int vorbis_encode_frame(AVCodecContext * avccontext, unsigned char * packets, int buf_size, void *data)
{
    venc_context_t * venc = avccontext->priv_data;
    signed short * audio = data;
966
    int samples = data ? avccontext->frame_size : 0;
967 968 969 970 971
    vorbis_mode_t * mode;
    mapping_t * mapping;
    PutBitContext pb;
    int i;

972
    if (!apply_window_and_mdct(venc, audio, samples)) return 0;
973
    samples = 1 << (venc->log2_blocksize[0] - 1);
974

975 976 977 978 979 980 981 982 983 984 985 986 987 988 989
    init_put_bits(&pb, packets, buf_size);

    put_bits(&pb, 1, 0); // magic bit

    put_bits(&pb, ilog(venc->nmodes - 1), 0); // 0 bits, the mode

    mode = &venc->modes[0];
    mapping = &venc->mappings[mode->mapping];
    if (mode->blockflag) {
        put_bits(&pb, 1, 0);
        put_bits(&pb, 1, 0);
    }

    for (i = 0; i < venc->channels; i++) {
        floor_t * fc = &venc->floors[mapping->floor[mapping->mux[i]]];
990
        uint_fast16_t posts[fc->values];
991
        floor_fit(venc, fc, &venc->coeffs[i * samples], posts, samples);
992
        floor_encode(venc, fc, &pb, posts, &venc->floor[i * samples], samples);
993
    }
Oded Shimon's avatar
Oded Shimon committed
994

995 996
    for (i = 0; i < venc->channels * samples; i++) {
        venc->coeffs[i] /= venc->floor[i];
997 998
    }

999 1000 1001 1002 1003 1004
    for (i = 0; i < mapping->coupling_steps; i++) {
        float * mag = venc->coeffs + mapping->magnitude[i] * samples;
        float * ang = venc->coeffs + mapping->angle[i] * samples;
        int j;
        for (j = 0; j < samples; j++) {
            float a = ang[j];
1005 1006 1007
            ang[j] -= mag[j];
            if (mag[j] > 0) ang[j] = -ang[j];
            if (ang[j] < 0) mag[j] = a;
1008 1009 1010
        }
    }

1011 1012
    residue_encode(venc, &venc->residues[mapping->residue[mapping->mux[0]]], &pb, venc->coeffs, samples, venc->channels);

1013
    flush_put_bits(&pb);
1014
    return (put_bits_count(&pb) + 7) / 8;
Oded Shimon's avatar
Oded Shimon committed
1015 1016 1017 1018 1019 1020
}


static int vorbis_encode_close(AVCodecContext * avccontext)
{
    venc_context_t * venc = avccontext->priv_data;
1021 1022
    int i;

1023 1024 1025 1026 1027 1028 1029 1030
    if (venc->codebooks)
        for (i = 0; i < venc->ncodebooks; i++) {
            av_freep(&venc->codebooks[i].lens);
            av_freep(&venc->codebooks[i].codewords);
            av_freep(&venc->codebooks[i].quantlist);
            av_freep(&venc->codebooks[i].dimentions);
            av_freep(&venc->codebooks[i].pow2);
        }
1031 1032
    av_freep(&venc->codebooks);

1033 1034 1035 1036 1037 1038
    if (venc->floors)
        for (i = 0; i < venc->nfloors; i++) {
            int j;
            if (venc->floors[i].classes)
                for (j = 0; j < venc->floors[i].nclasses; j++)
                    av_freep(&venc->floors[i].classes[j].books);
1039
            av_freep(&venc->floors[i].classes);
1040 1041 1042
            av_freep(&venc->floors[i].partition_to_class);
            av_freep(&venc->floors[i].list);
        }
1043 1044
    av_freep(&venc->floors);

1045 1046 1047 1048 1049
    if (venc->residues)
        for (i = 0; i < venc->nresidues; i++) {
            av_freep(&venc->residues[i].books);
            av_freep(&venc->residues[i].maxes);
        }
1050 1051
    av_freep(&venc->residues);

1052 1053 1054 1055 1056
    if (venc->mappings)
        for (i = 0; i < venc->nmappings; i++) {
            av_freep(&venc->mappings[i].mux);
            av_freep(&venc->mappings[i].floor);
            av_freep(&venc->mappings[i].residue);
Oded Shimon's avatar
Oded Shimon committed
1057 1058
            av_freep(&venc->mappings[i].magnitude);
            av_freep(&venc->mappings[i].angle);
1059
        }
1060 1061 1062
    av_freep(&venc->mappings);

    av_freep(&venc->modes);
Oded Shimon's avatar
Oded Shimon committed
1063

1064 1065 1066 1067 1068 1069 1070 1071
    av_freep(&venc->saved);
    av_freep(&venc->samples);
    av_freep(&venc->floor);
    av_freep(&venc->coeffs);

    ff_mdct_end(&venc->mdct[0]);
    ff_mdct_end(&venc->mdct[1]);

Oded Shimon's avatar
Oded Shimon committed
1072 1073 1074 1075 1076 1077
    av_freep(&avccontext->coded_frame);
    av_freep(&avccontext->extradata);

    return 0 ;
}

1078
AVCodec vorbis_encoder = {
Oded Shimon's avatar
Oded Shimon committed
1079 1080 1081 1082 1083 1084 1085 1086 1087
    "vorbis",
    CODEC_TYPE_AUDIO,
    CODEC_ID_VORBIS,
    sizeof(venc_context_t),
    vorbis_encode_init,
    vorbis_encode_frame,
    vorbis_encode_close,
    .capabilities= CODEC_CAP_DELAY,
};