alacenc.c 22 KB
Newer Older
1
/*
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 * ALAC audio encoder
 * Copyright (c) 2008  Jaikrishnan Menon <realityman@gmx.net>
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * 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
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

22 23
#include "libavutil/opt.h"

24
#include "avcodec.h"
25
#include "put_bits.h"
26
#include "internal.h"
27
#include "lpc.h"
Benoit Fouet's avatar
Benoit Fouet committed
28
#include "mathops.h"
29
#include "alac_data.h"
30 31 32 33 34 35 36 37

#define DEFAULT_FRAME_SIZE        4096
#define ALAC_EXTRADATA_SIZE       36
#define ALAC_FRAME_HEADER_SIZE    55
#define ALAC_FRAME_FOOTER_SIZE    3

#define ALAC_ESCAPE_CODE          0x1FF
#define ALAC_MAX_LPC_ORDER        30
38 39 40
#define DEFAULT_MAX_PRED_ORDER    6
#define DEFAULT_MIN_PRED_ORDER    4
#define ALAC_MAX_LPC_PRECISION    9
41
#define ALAC_MIN_LPC_SHIFT        0
42 43
#define ALAC_MAX_LPC_SHIFT        9

44 45 46 47 48
#define ALAC_CHMODE_LEFT_RIGHT    0
#define ALAC_CHMODE_LEFT_SIDE     1
#define ALAC_CHMODE_RIGHT_SIDE    2
#define ALAC_CHMODE_MID_SIDE      3

49 50 51 52 53 54 55
typedef struct RiceContext {
    int history_mult;
    int initial_history;
    int k_modifier;
    int rice_modifier;
} RiceContext;

56
typedef struct AlacLPCContext {
57 58 59
    int lpc_order;
    int lpc_coeff[ALAC_MAX_LPC_ORDER+1];
    int lpc_quant;
60
} AlacLPCContext;
61 62

typedef struct AlacEncodeContext {
63
    const AVClass *class;
64
    AVCodecContext *avctx;
65
    int frame_size;                     /**< current frame size               */
66
    int verbatim;                       /**< current frame verbatim mode flag */
67
    int compression_level;
68 69
    int min_prediction_order;
    int max_prediction_order;
70 71
    int max_coded_frame_size;
    int write_sample_size;
72
    int extra_bits;
73
    int32_t sample_buf[2][DEFAULT_FRAME_SIZE];
74
    int32_t predictor_buf[2][DEFAULT_FRAME_SIZE];
75 76 77
    int interlacing_shift;
    int interlacing_leftweight;
    PutBitContext pbctx;
78
    RiceContext rc;
79
    AlacLPCContext lpc[2];
80
    LPCContext lpc_ctx;
81 82 83
} AlacEncodeContext;


84
static void init_sample_buffers(AlacEncodeContext *s, int channels,
85
                                const uint8_t *samples[2])
86 87
{
    int ch, i;
88 89 90 91
    int shift = av_get_bytes_per_sample(s->avctx->sample_fmt) * 8 -
                s->avctx->bits_per_raw_sample;

#define COPY_SAMPLES(type) do {                             \
92
        for (ch = 0; ch < channels; ch++) {                 \
93 94 95 96 97 98 99 100 101 102 103
            int32_t       *bptr = s->sample_buf[ch];        \
            const type *sptr = (const type *)samples[ch];   \
            for (i = 0; i < s->frame_size; i++)             \
                bptr[i] = sptr[i] >> shift;                 \
        }                                                   \
    } while (0)

    if (s->avctx->sample_fmt == AV_SAMPLE_FMT_S32P)
        COPY_SAMPLES(int32_t);
    else
        COPY_SAMPLES(int16_t);
104 105
}

106 107
static void encode_scalar(AlacEncodeContext *s, int x,
                          int k, int write_sample_size)
108 109 110 111 112 113 114 115
{
    int divisor, q, r;

    k = FFMIN(k, s->rc.k_modifier);
    divisor = (1<<k) - 1;
    q = x / divisor;
    r = x % divisor;

116
    if (q > 8) {
117 118 119 120
        // write escape code and sample value directly
        put_bits(&s->pbctx, 9, ALAC_ESCAPE_CODE);
        put_bits(&s->pbctx, write_sample_size, x);
    } else {
121
        if (q)
122 123 124
            put_bits(&s->pbctx, q, (1<<q) - 1);
        put_bits(&s->pbctx, 1, 0);

125 126
        if (k != 1) {
            if (r > 0)
127 128 129 130 131 132 133
                put_bits(&s->pbctx, k, r+1);
            else
                put_bits(&s->pbctx, k-1, 0);
        }
    }
}

134 135 136
static void write_element_header(AlacEncodeContext *s,
                                 enum AlacRawDataBlockType element,
                                 int instance)
137
{
138 139 140 141 142
    int encode_fs = 0;

    if (s->frame_size < DEFAULT_FRAME_SIZE)
        encode_fs = 1;

143 144 145
    put_bits(&s->pbctx, 3,  element);               // element type
    put_bits(&s->pbctx, 4,  instance);              // element instance
    put_bits(&s->pbctx, 12, 0);                     // unused header bits
146
    put_bits(&s->pbctx, 1,  encode_fs);             // Sample count is in the header
147
    put_bits(&s->pbctx, 2,  s->extra_bits >> 3);    // Extra bytes (for 24-bit)
148
    put_bits(&s->pbctx, 1,  s->verbatim);           // Audio block is verbatim
149 150
    if (encode_fs)
        put_bits32(&s->pbctx, s->frame_size);       // No. of samples in the frame
151 152
}

153 154 155 156 157 158
static void calc_predictor_params(AlacEncodeContext *s, int ch)
{
    int32_t coefs[MAX_LPC_ORDER][MAX_LPC_ORDER];
    int shift[MAX_LPC_ORDER];
    int opt_order;

159
    if (s->compression_level == 1) {
160 161 162 163 164 165 166 167 168
        s->lpc[ch].lpc_order = 6;
        s->lpc[ch].lpc_quant = 6;
        s->lpc[ch].lpc_coeff[0] =  160;
        s->lpc[ch].lpc_coeff[1] = -190;
        s->lpc[ch].lpc_coeff[2] =  170;
        s->lpc[ch].lpc_coeff[3] = -130;
        s->lpc[ch].lpc_coeff[4] =   80;
        s->lpc[ch].lpc_coeff[5] =  -25;
    } else {
169
        opt_order = ff_lpc_calc_coefs(&s->lpc_ctx, s->sample_buf[ch],
170
                                      s->frame_size,
171 172
                                      s->min_prediction_order,
                                      s->max_prediction_order,
173
                                      ALAC_MAX_LPC_PRECISION, coefs, shift,
174
                                      FF_LPC_TYPE_LEVINSON, 0,
175 176
                                      ORDER_METHOD_EST, ALAC_MIN_LPC_SHIFT,
                                      ALAC_MAX_LPC_SHIFT, 1);
177 178 179 180

        s->lpc[ch].lpc_order = opt_order;
        s->lpc[ch].lpc_quant = shift[opt_order-1];
        memcpy(s->lpc[ch].lpc_coeff, coefs[opt_order-1], opt_order*sizeof(int));
181
    }
182 183
}

184 185 186 187 188 189 190 191 192
static int estimate_stereo_mode(int32_t *left_ch, int32_t *right_ch, int n)
{
    int i, best;
    int32_t lt, rt;
    uint64_t sum[4];
    uint64_t score[4];

    /* calculate sum of 2nd order residual for each channel */
    sum[0] = sum[1] = sum[2] = sum[3] = 0;
193
    for (i = 2; i < n; i++) {
194 195
        lt =  left_ch[i] - 2 *  left_ch[i - 1] +  left_ch[i - 2];
        rt = right_ch[i] - 2 * right_ch[i - 1] + right_ch[i - 2];
196 197 198 199 200 201 202 203 204 205 206 207 208 209
        sum[2] += FFABS((lt + rt) >> 1);
        sum[3] += FFABS(lt - rt);
        sum[0] += FFABS(lt);
        sum[1] += FFABS(rt);
    }

    /* calculate score for each mode */
    score[0] = sum[0] + sum[1];
    score[1] = sum[0] + sum[3];
    score[2] = sum[1] + sum[3];
    score[3] = sum[2] + sum[3];

    /* return mode with lowest score */
    best = 0;
210
    for (i = 1; i < 4; i++) {
211
        if (score[i] < score[best])
212 213
            best = i;
    }
214 215 216 217 218 219
    return best;
}

static void alac_stereo_decorrelation(AlacEncodeContext *s)
{
    int32_t *left = s->sample_buf[0], *right = s->sample_buf[1];
220
    int i, mode, n = s->frame_size;
221 222 223 224
    int32_t tmp;

    mode = estimate_stereo_mode(left, right, n);

225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253
    switch (mode) {
    case ALAC_CHMODE_LEFT_RIGHT:
        s->interlacing_leftweight = 0;
        s->interlacing_shift      = 0;
        break;
    case ALAC_CHMODE_LEFT_SIDE:
        for (i = 0; i < n; i++)
            right[i] = left[i] - right[i];
        s->interlacing_leftweight = 1;
        s->interlacing_shift      = 0;
        break;
    case ALAC_CHMODE_RIGHT_SIDE:
        for (i = 0; i < n; i++) {
            tmp = right[i];
            right[i] = left[i] - right[i];
            left[i]  = tmp + (right[i] >> 31);
        }
        s->interlacing_leftweight = 1;
        s->interlacing_shift      = 31;
        break;
    default:
        for (i = 0; i < n; i++) {
            tmp = left[i];
            left[i]  = (tmp + right[i]) >> 1;
            right[i] =  tmp - right[i];
        }
        s->interlacing_leftweight = 1;
        s->interlacing_shift      = 1;
        break;
254 255
    }
}
256

257 258 259
static void alac_linear_predictor(AlacEncodeContext *s, int ch)
{
    int i;
260
    AlacLPCContext lpc = s->lpc[ch];
261
    int32_t *residual = s->predictor_buf[ch];
262

263
    if (lpc.lpc_order == 31) {
264
        residual[0] = s->sample_buf[ch][0];
265

266
        for (i = 1; i < s->frame_size; i++) {
267 268
            residual[i] = s->sample_buf[ch][i    ] -
                          s->sample_buf[ch][i - 1];
269
        }
270 271 272 273 274 275

        return;
    }

    // generalised linear predictor

276
    if (lpc.lpc_order > 0) {
277 278 279 280
        int32_t *samples  = s->sample_buf[ch];

        // generate warm-up samples
        residual[0] = samples[0];
281
        for (i = 1; i <= lpc.lpc_order; i++)
282
            residual[i] = sign_extend(samples[i] - samples[i-1], s->write_sample_size);
283 284

        // perform lpc on remaining samples
285
        for (i = lpc.lpc_order + 1; i < s->frame_size; i++) {
286 287 288 289
            int sum = 1 << (lpc.lpc_quant - 1), res_val, j;

            for (j = 0; j < lpc.lpc_order; j++) {
                sum += (samples[lpc.lpc_order-j] - samples[0]) *
290
                       lpc.lpc_coeff[j];
291 292 293 294
            }

            sum >>= lpc.lpc_quant;
            sum += samples[0];
Benoit Fouet's avatar
Benoit Fouet committed
295 296
            residual[i] = sign_extend(samples[lpc.lpc_order+1] - sum,
                                      s->write_sample_size);
297 298
            res_val = residual[i];

299
            if (res_val) {
300 301 302
                int index = lpc.lpc_order - 1;
                int neg = (res_val < 0);

303 304
                while (index >= 0 && (neg ? (res_val < 0) : (res_val > 0))) {
                    int val  = samples[0] - samples[lpc.lpc_order - index];
305 306
                    int sign = (val ? FFSIGN(val) : 0);

307 308
                    if (neg)
                        sign *= -1;
309 310 311

                    lpc.lpc_coeff[index] -= sign;
                    val *= sign;
312
                    res_val -= (val >> lpc.lpc_quant) * (lpc.lpc_order - index);
313 314 315 316 317 318 319 320
                    index--;
                }
            }
            samples++;
        }
    }
}

321
static void alac_entropy_coder(AlacEncodeContext *s, int ch)
322 323 324
{
    unsigned int history = s->rc.initial_history;
    int sign_modifier = 0, i, k;
325
    int32_t *samples = s->predictor_buf[ch];
326

327
    for (i = 0; i < s->frame_size;) {
328 329 330 331
        int x;

        k = av_log2((history >> 9) + 3);

332 333
        x  = -2 * (*samples) -1;
        x ^= x >> 31;
334 335 336 337 338 339

        samples++;
        i++;

        encode_scalar(s, x - sign_modifier, k, s->write_sample_size);

340 341
        history += x * s->rc.history_mult -
                   ((history * s->rc.history_mult) >> 9);
342 343

        sign_modifier = 0;
344
        if (x > 0xFFFF)
345 346
            history = 0xFFFF;

347
        if (history < 128 && i < s->frame_size) {
348 349 350 351
            unsigned int block_size = 0;

            k = 7 - av_log2(history) + ((history + 16) >> 6);

352
            while (*samples == 0 && i < s->frame_size) {
353 354 355 356 357 358 359 360 361 362 363 364
                samples++;
                i++;
                block_size++;
            }
            encode_scalar(s, block_size, k, 16);
            sign_modifier = (block_size <= 0xFFFF);
            history = 0;
        }

    }
}

365 366 367
static void write_element(AlacEncodeContext *s,
                          enum AlacRawDataBlockType element, int instance,
                          const uint8_t *samples0, const uint8_t *samples1)
368
{
369
    const uint8_t *samples[2] = { samples0, samples1 };
370
    int i, j, channels;
371
    int prediction_type = 0;
372
    PutBitContext *pb = &s->pbctx;
373

374
    channels = element == TYPE_CPE ? 2 : 1;
375 376

    if (s->verbatim) {
377
        write_element_header(s, element, instance);
378
        /* samples are channel-interleaved in verbatim mode */
379 380
        if (s->avctx->sample_fmt == AV_SAMPLE_FMT_S32P) {
            int shift = 32 - s->avctx->bits_per_raw_sample;
381
            const int32_t *samples_s32[2] = { (const int32_t *)samples0,
382
                                              (const int32_t *)samples1 };
383
            for (i = 0; i < s->frame_size; i++)
384
                for (j = 0; j < channels; j++)
385 386 387
                    put_sbits(pb, s->avctx->bits_per_raw_sample,
                              samples_s32[j][i] >> shift);
        } else {
388
            const int16_t *samples_s16[2] = { (const int16_t *)samples0,
389
                                              (const int16_t *)samples1 };
390
            for (i = 0; i < s->frame_size; i++)
391
                for (j = 0; j < channels; j++)
392 393 394
                    put_sbits(pb, s->avctx->bits_per_raw_sample,
                              samples_s16[j][i]);
        }
395
    } else {
396 397
        s->write_sample_size = s->avctx->bits_per_raw_sample - s->extra_bits +
                               channels - 1;
398

399 400 401
        init_sample_buffers(s, channels, samples);
        write_element_header(s, element, instance);

402 403 404 405 406 407 408 409 410 411 412 413 414
        // extract extra bits if needed
        if (s->extra_bits) {
            uint32_t mask = (1 << s->extra_bits) - 1;
            for (j = 0; j < channels; j++) {
                int32_t *extra = s->predictor_buf[j];
                int32_t *smp   = s->sample_buf[j];
                for (i = 0; i < s->frame_size; i++) {
                    extra[i] = smp[i] & mask;
                    smp[i] >>= s->extra_bits;
                }
            }
        }

415
        if (channels == 2)
416
            alac_stereo_decorrelation(s);
417 418
        else
            s->interlacing_shift = s->interlacing_leftweight = 0;
419 420
        put_bits(pb, 8, s->interlacing_shift);
        put_bits(pb, 8, s->interlacing_leftweight);
421

422
        for (i = 0; i < channels; i++) {
423
            calc_predictor_params(s, i);
424

425 426
            put_bits(pb, 4, prediction_type);
            put_bits(pb, 4, s->lpc[i].lpc_quant);
427

428 429 430 431 432
            put_bits(pb, 3, s->rc.rice_modifier);
            put_bits(pb, 5, s->lpc[i].lpc_order);
            // predictor coeff. table
            for (j = 0; j < s->lpc[i].lpc_order; j++)
                put_sbits(pb, 16, s->lpc[i].lpc_coeff[j]);
433 434
        }

435 436 437
        // write extra bits if needed
        if (s->extra_bits) {
            for (i = 0; i < s->frame_size; i++) {
438
                for (j = 0; j < channels; j++) {
439
                    put_bits(pb, s->extra_bits, s->predictor_buf[j][i]);
440 441 442 443
                }
            }
        }

444
        // apply lpc and entropy coding to audio samples
445
        for (i = 0; i < channels; i++) {
446
            alac_linear_predictor(s, i);
447

448 449 450
            // TODO: determine when this will actually help. for now it's not used.
            if (prediction_type == 15) {
                // 2nd pass 1st order filter
451
                int32_t *residual = s->predictor_buf[i];
452
                for (j = s->frame_size - 1; j > 0; j--)
453
                    residual[j] -= residual[j - 1];
454
            }
455
            alac_entropy_coder(s, i);
456
        }
457
    }
458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485
}

static int write_frame(AlacEncodeContext *s, AVPacket *avpkt,
                       uint8_t * const *samples)
{
    PutBitContext *pb = &s->pbctx;
    const enum AlacRawDataBlockType *ch_elements = ff_alac_channel_elements[s->avctx->channels - 1];
    const uint8_t *ch_map = ff_alac_channel_layout_offsets[s->avctx->channels - 1];
    int ch, element, sce, cpe;

    init_put_bits(pb, avpkt->data, avpkt->size);

    ch = element = sce = cpe = 0;
    while (ch < s->avctx->channels) {
        if (ch_elements[element] == TYPE_CPE) {
            write_element(s, TYPE_CPE, cpe, samples[ch_map[ch]],
                          samples[ch_map[ch + 1]]);
            cpe++;
            ch += 2;
        } else {
            write_element(s, TYPE_SCE, sce, samples[ch_map[ch]], NULL);
            sce++;
            ch++;
        }
        element++;
    }

    put_bits(pb, 3, TYPE_END);
486
    flush_put_bits(pb);
487

488
    return put_bits_count(pb) >> 3;
489 490
}

491 492
static av_always_inline int get_max_frame_size(int frame_size, int ch, int bps)
{
493 494
    int header_bits = 23 + 32 * (frame_size < DEFAULT_FRAME_SIZE);
    return FFALIGN(header_bits + bps * ch * frame_size + 3, 8) / 8;
495 496
}

497 498 499 500 501 502 503
static av_cold int alac_encode_close(AVCodecContext *avctx)
{
    AlacEncodeContext *s = avctx->priv_data;
    ff_lpc_end(&s->lpc_ctx);
    av_freep(&avctx->extradata);
    avctx->extradata_size = 0;
    return 0;
504 505 506 507
}

static av_cold int alac_encode_init(AVCodecContext *avctx)
{
508
    AlacEncodeContext *s = avctx->priv_data;
509
    int ret;
510
    uint8_t *alac_extradata;
511

512
    avctx->frame_size = s->frame_size = DEFAULT_FRAME_SIZE;
513

514 515 516 517 518 519 520 521 522
    if (avctx->sample_fmt == AV_SAMPLE_FMT_S32P) {
        if (avctx->bits_per_raw_sample != 24)
            av_log(avctx, AV_LOG_WARNING, "encoding as 24 bits-per-sample\n");
        avctx->bits_per_raw_sample = 24;
    } else {
        avctx->bits_per_raw_sample = 16;
        s->extra_bits              = 0;
    }

523
    // Set default compression level
524
    if (avctx->compression_level == FF_COMPRESSION_DEFAULT)
525
        s->compression_level = 2;
526
    else
527
        s->compression_level = av_clip(avctx->compression_level, 0, 2);
528 529 530 531 532 533 534

    // Initialize default Rice parameters
    s->rc.history_mult    = 40;
    s->rc.initial_history = 10;
    s->rc.k_modifier      = 14;
    s->rc.rice_modifier   = 4;

535 536
    s->max_coded_frame_size = get_max_frame_size(avctx->frame_size,
                                                 avctx->channels,
537
                                                 avctx->bits_per_raw_sample);
538

539
    avctx->extradata = av_mallocz(ALAC_EXTRADATA_SIZE + AV_INPUT_BUFFER_PADDING_SIZE);
540 541 542 543 544 545 546
    if (!avctx->extradata) {
        ret = AVERROR(ENOMEM);
        goto error;
    }
    avctx->extradata_size = ALAC_EXTRADATA_SIZE;

    alac_extradata = avctx->extradata;
547 548 549
    AV_WB32(alac_extradata,    ALAC_EXTRADATA_SIZE);
    AV_WB32(alac_extradata+4,  MKBETAG('a','l','a','c'));
    AV_WB32(alac_extradata+12, avctx->frame_size);
550
    AV_WB8 (alac_extradata+17, avctx->bits_per_raw_sample);
551
    AV_WB8 (alac_extradata+21, avctx->channels);
552
    AV_WB32(alac_extradata+24, s->max_coded_frame_size);
553
    AV_WB32(alac_extradata+28,
554
            avctx->sample_rate * avctx->channels * avctx->bits_per_raw_sample); // average bitrate
555
    AV_WB32(alac_extradata+32, avctx->sample_rate);
556 557

    // Set relevant extradata fields
558
    if (s->compression_level > 0) {
559 560 561 562 563
        AV_WB8(alac_extradata+18, s->rc.history_mult);
        AV_WB8(alac_extradata+19, s->rc.initial_history);
        AV_WB8(alac_extradata+20, s->rc.k_modifier);
    }

564 565
#if FF_API_PRIVATE_OPT
FF_DISABLE_DEPRECATION_WARNINGS
566 567
    if (avctx->min_prediction_order >= 0) {
        if (avctx->min_prediction_order < MIN_LPC_ORDER ||
568
           avctx->min_prediction_order > ALAC_MAX_LPC_ORDER) {
569 570
            av_log(avctx, AV_LOG_ERROR, "invalid min prediction order: %d\n",
                   avctx->min_prediction_order);
571 572
            ret = AVERROR(EINVAL);
            goto error;
573 574 575 576 577
        }

        s->min_prediction_order = avctx->min_prediction_order;
    }

578 579 580 581 582
    if (avctx->max_prediction_order >= 0) {
        if (avctx->max_prediction_order < MIN_LPC_ORDER ||
            avctx->max_prediction_order > ALAC_MAX_LPC_ORDER) {
            av_log(avctx, AV_LOG_ERROR, "invalid max prediction order: %d\n",
                   avctx->max_prediction_order);
583 584
            ret = AVERROR(EINVAL);
            goto error;
585 586 587 588
        }

        s->max_prediction_order = avctx->max_prediction_order;
    }
589 590
FF_ENABLE_DEPRECATION_WARNINGS
#endif
591

592 593 594
    if (s->max_prediction_order < s->min_prediction_order) {
        av_log(avctx, AV_LOG_ERROR,
               "invalid prediction orders: min=%d max=%d\n",
595
               s->min_prediction_order, s->max_prediction_order);
596 597
        ret = AVERROR(EINVAL);
        goto error;
598 599
    }

600 601
    s->avctx = avctx;

602 603 604 605 606 607 608 609 610
    if ((ret = ff_lpc_init(&s->lpc_ctx, avctx->frame_size,
                           s->max_prediction_order,
                           FF_LPC_TYPE_LEVINSON)) < 0) {
        goto error;
    }

    return 0;
error:
    alac_encode_close(avctx);
611
    return ret;
612 613
}

614 615
static int alac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
                             const AVFrame *frame, int *got_packet_ptr)
616 617
{
    AlacEncodeContext *s = avctx->priv_data;
618
    int out_bytes, max_frame_size, ret;
619

620
    s->frame_size = frame->nb_samples;
621

622
    if (frame->nb_samples < DEFAULT_FRAME_SIZE)
623
        max_frame_size = get_max_frame_size(s->frame_size, avctx->channels,
624
                                            avctx->bits_per_raw_sample);
625 626
    else
        max_frame_size = s->max_coded_frame_size;
627

628
    if ((ret = ff_alloc_packet2(avctx, avpkt, 4 * max_frame_size, 0)) < 0)
629
        return ret;
630

631
    /* use verbatim mode for compression_level 0 */
632 633 634 635 636 637 638
    if (s->compression_level) {
        s->verbatim   = 0;
        s->extra_bits = avctx->bits_per_raw_sample - 16;
    } else {
        s->verbatim   = 1;
        s->extra_bits = 0;
    }
639

640
    out_bytes = write_frame(s, avpkt, frame->extended_data);
641

642
    if (out_bytes > max_frame_size) {
643
        /* frame too large. use verbatim mode */
644
        s->verbatim = 1;
645 646
        s->extra_bits = 0;
        out_bytes = write_frame(s, avpkt, frame->extended_data);
647 648
    }

649 650
    avpkt->size = out_bytes;
    *got_packet_ptr = 1;
651 652 653
    return 0;
}

654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669
#define OFFSET(x) offsetof(AlacEncodeContext, x)
#define AE AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
static const AVOption options[] = {
    { "min_prediction_order", NULL, OFFSET(min_prediction_order), AV_OPT_TYPE_INT, { .i64 = DEFAULT_MIN_PRED_ORDER }, MIN_LPC_ORDER, ALAC_MAX_LPC_ORDER, AE },
    { "max_prediction_order", NULL, OFFSET(max_prediction_order), AV_OPT_TYPE_INT, { .i64 = DEFAULT_MAX_PRED_ORDER }, MIN_LPC_ORDER, ALAC_MAX_LPC_ORDER, AE },

    { NULL },
};

static const AVClass alacenc_class = {
    .class_name = "alacenc",
    .item_name  = av_default_item_name,
    .option     = options,
    .version    = LIBAVUTIL_VERSION_INT,
};

670
AVCodec ff_alac_encoder = {
671
    .name           = "alac",
672
    .long_name      = NULL_IF_CONFIG_SMALL("ALAC (Apple Lossless Audio Codec)"),
673
    .type           = AVMEDIA_TYPE_AUDIO,
674
    .id             = AV_CODEC_ID_ALAC,
675
    .priv_data_size = sizeof(AlacEncodeContext),
676
    .priv_class     = &alacenc_class,
677
    .init           = alac_encode_init,
678
    .encode2        = alac_encode_frame,
679
    .close          = alac_encode_close,
680
    .capabilities   = AV_CODEC_CAP_SMALL_LAST_FRAME,
681
    .channel_layouts = ff_alac_channel_layouts,
682 683
    .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S32P,
                                                     AV_SAMPLE_FMT_S16P,
684
                                                     AV_SAMPLE_FMT_NONE },
685
};