annotate ffmpeg/libavcodec/flacenc.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 * FLAC audio encoder
yading@10 3 * Copyright (c) 2006 Justin Ruggles <justin.ruggles@gmail.com>
yading@10 4 *
yading@10 5 * This file is part of FFmpeg.
yading@10 6 *
yading@10 7 * FFmpeg is free software; you can redistribute it and/or
yading@10 8 * modify it under the terms of the GNU Lesser General Public
yading@10 9 * License as published by the Free Software Foundation; either
yading@10 10 * version 2.1 of the License, or (at your option) any later version.
yading@10 11 *
yading@10 12 * FFmpeg is distributed in the hope that it will be useful,
yading@10 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 15 * Lesser General Public License for more details.
yading@10 16 *
yading@10 17 * You should have received a copy of the GNU Lesser General Public
yading@10 18 * License along with FFmpeg; if not, write to the Free Software
yading@10 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 20 */
yading@10 21
yading@10 22 #include "libavutil/avassert.h"
yading@10 23 #include "libavutil/crc.h"
yading@10 24 #include "libavutil/intmath.h"
yading@10 25 #include "libavutil/md5.h"
yading@10 26 #include "libavutil/opt.h"
yading@10 27 #include "avcodec.h"
yading@10 28 #include "dsputil.h"
yading@10 29 #include "put_bits.h"
yading@10 30 #include "golomb.h"
yading@10 31 #include "internal.h"
yading@10 32 #include "lpc.h"
yading@10 33 #include "flac.h"
yading@10 34 #include "flacdata.h"
yading@10 35 #include "flacdsp.h"
yading@10 36
yading@10 37 #define FLAC_SUBFRAME_CONSTANT 0
yading@10 38 #define FLAC_SUBFRAME_VERBATIM 1
yading@10 39 #define FLAC_SUBFRAME_FIXED 8
yading@10 40 #define FLAC_SUBFRAME_LPC 32
yading@10 41
yading@10 42 #define MAX_FIXED_ORDER 4
yading@10 43 #define MAX_PARTITION_ORDER 8
yading@10 44 #define MAX_PARTITIONS (1 << MAX_PARTITION_ORDER)
yading@10 45 #define MAX_LPC_PRECISION 15
yading@10 46 #define MAX_LPC_SHIFT 15
yading@10 47
yading@10 48 enum CodingMode {
yading@10 49 CODING_MODE_RICE = 4,
yading@10 50 CODING_MODE_RICE2 = 5,
yading@10 51 };
yading@10 52
yading@10 53 typedef struct CompressionOptions {
yading@10 54 int compression_level;
yading@10 55 int block_time_ms;
yading@10 56 enum FFLPCType lpc_type;
yading@10 57 int lpc_passes;
yading@10 58 int lpc_coeff_precision;
yading@10 59 int min_prediction_order;
yading@10 60 int max_prediction_order;
yading@10 61 int prediction_order_method;
yading@10 62 int min_partition_order;
yading@10 63 int max_partition_order;
yading@10 64 int ch_mode;
yading@10 65 } CompressionOptions;
yading@10 66
yading@10 67 typedef struct RiceContext {
yading@10 68 enum CodingMode coding_mode;
yading@10 69 int porder;
yading@10 70 int params[MAX_PARTITIONS];
yading@10 71 } RiceContext;
yading@10 72
yading@10 73 typedef struct FlacSubframe {
yading@10 74 int type;
yading@10 75 int type_code;
yading@10 76 int obits;
yading@10 77 int wasted;
yading@10 78 int order;
yading@10 79 int32_t coefs[MAX_LPC_ORDER];
yading@10 80 int shift;
yading@10 81 RiceContext rc;
yading@10 82 int32_t samples[FLAC_MAX_BLOCKSIZE];
yading@10 83 int32_t residual[FLAC_MAX_BLOCKSIZE+1];
yading@10 84 } FlacSubframe;
yading@10 85
yading@10 86 typedef struct FlacFrame {
yading@10 87 FlacSubframe subframes[FLAC_MAX_CHANNELS];
yading@10 88 int blocksize;
yading@10 89 int bs_code[2];
yading@10 90 uint8_t crc8;
yading@10 91 int ch_mode;
yading@10 92 int verbatim_only;
yading@10 93 } FlacFrame;
yading@10 94
yading@10 95 typedef struct FlacEncodeContext {
yading@10 96 AVClass *class;
yading@10 97 PutBitContext pb;
yading@10 98 int channels;
yading@10 99 int samplerate;
yading@10 100 int sr_code[2];
yading@10 101 int bps_code;
yading@10 102 int max_blocksize;
yading@10 103 int min_framesize;
yading@10 104 int max_framesize;
yading@10 105 int max_encoded_framesize;
yading@10 106 uint32_t frame_count;
yading@10 107 uint64_t sample_count;
yading@10 108 uint8_t md5sum[16];
yading@10 109 FlacFrame frame;
yading@10 110 CompressionOptions options;
yading@10 111 AVCodecContext *avctx;
yading@10 112 LPCContext lpc_ctx;
yading@10 113 struct AVMD5 *md5ctx;
yading@10 114 uint8_t *md5_buffer;
yading@10 115 unsigned int md5_buffer_size;
yading@10 116 DSPContext dsp;
yading@10 117 FLACDSPContext flac_dsp;
yading@10 118 } FlacEncodeContext;
yading@10 119
yading@10 120
yading@10 121 /**
yading@10 122 * Write streaminfo metadata block to byte array.
yading@10 123 */
yading@10 124 static void write_streaminfo(FlacEncodeContext *s, uint8_t *header)
yading@10 125 {
yading@10 126 PutBitContext pb;
yading@10 127
yading@10 128 memset(header, 0, FLAC_STREAMINFO_SIZE);
yading@10 129 init_put_bits(&pb, header, FLAC_STREAMINFO_SIZE);
yading@10 130
yading@10 131 /* streaminfo metadata block */
yading@10 132 put_bits(&pb, 16, s->max_blocksize);
yading@10 133 put_bits(&pb, 16, s->max_blocksize);
yading@10 134 put_bits(&pb, 24, s->min_framesize);
yading@10 135 put_bits(&pb, 24, s->max_framesize);
yading@10 136 put_bits(&pb, 20, s->samplerate);
yading@10 137 put_bits(&pb, 3, s->channels-1);
yading@10 138 put_bits(&pb, 5, s->avctx->bits_per_raw_sample - 1);
yading@10 139 /* write 36-bit sample count in 2 put_bits() calls */
yading@10 140 put_bits(&pb, 24, (s->sample_count & 0xFFFFFF000LL) >> 12);
yading@10 141 put_bits(&pb, 12, s->sample_count & 0x000000FFFLL);
yading@10 142 flush_put_bits(&pb);
yading@10 143 memcpy(&header[18], s->md5sum, 16);
yading@10 144 }
yading@10 145
yading@10 146
yading@10 147 /**
yading@10 148 * Set blocksize based on samplerate.
yading@10 149 * Choose the closest predefined blocksize >= BLOCK_TIME_MS milliseconds.
yading@10 150 */
yading@10 151 static int select_blocksize(int samplerate, int block_time_ms)
yading@10 152 {
yading@10 153 int i;
yading@10 154 int target;
yading@10 155 int blocksize;
yading@10 156
yading@10 157 av_assert0(samplerate > 0);
yading@10 158 blocksize = ff_flac_blocksize_table[1];
yading@10 159 target = (samplerate * block_time_ms) / 1000;
yading@10 160 for (i = 0; i < 16; i++) {
yading@10 161 if (target >= ff_flac_blocksize_table[i] &&
yading@10 162 ff_flac_blocksize_table[i] > blocksize) {
yading@10 163 blocksize = ff_flac_blocksize_table[i];
yading@10 164 }
yading@10 165 }
yading@10 166 return blocksize;
yading@10 167 }
yading@10 168
yading@10 169
yading@10 170 static av_cold void dprint_compression_options(FlacEncodeContext *s)
yading@10 171 {
yading@10 172 AVCodecContext *avctx = s->avctx;
yading@10 173 CompressionOptions *opt = &s->options;
yading@10 174
yading@10 175 av_log(avctx, AV_LOG_DEBUG, " compression: %d\n", opt->compression_level);
yading@10 176
yading@10 177 switch (opt->lpc_type) {
yading@10 178 case FF_LPC_TYPE_NONE:
yading@10 179 av_log(avctx, AV_LOG_DEBUG, " lpc type: None\n");
yading@10 180 break;
yading@10 181 case FF_LPC_TYPE_FIXED:
yading@10 182 av_log(avctx, AV_LOG_DEBUG, " lpc type: Fixed pre-defined coefficients\n");
yading@10 183 break;
yading@10 184 case FF_LPC_TYPE_LEVINSON:
yading@10 185 av_log(avctx, AV_LOG_DEBUG, " lpc type: Levinson-Durbin recursion with Welch window\n");
yading@10 186 break;
yading@10 187 case FF_LPC_TYPE_CHOLESKY:
yading@10 188 av_log(avctx, AV_LOG_DEBUG, " lpc type: Cholesky factorization, %d pass%s\n",
yading@10 189 opt->lpc_passes, opt->lpc_passes == 1 ? "" : "es");
yading@10 190 break;
yading@10 191 }
yading@10 192
yading@10 193 av_log(avctx, AV_LOG_DEBUG, " prediction order: %d, %d\n",
yading@10 194 opt->min_prediction_order, opt->max_prediction_order);
yading@10 195
yading@10 196 switch (opt->prediction_order_method) {
yading@10 197 case ORDER_METHOD_EST:
yading@10 198 av_log(avctx, AV_LOG_DEBUG, " order method: %s\n", "estimate");
yading@10 199 break;
yading@10 200 case ORDER_METHOD_2LEVEL:
yading@10 201 av_log(avctx, AV_LOG_DEBUG, " order method: %s\n", "2-level");
yading@10 202 break;
yading@10 203 case ORDER_METHOD_4LEVEL:
yading@10 204 av_log(avctx, AV_LOG_DEBUG, " order method: %s\n", "4-level");
yading@10 205 break;
yading@10 206 case ORDER_METHOD_8LEVEL:
yading@10 207 av_log(avctx, AV_LOG_DEBUG, " order method: %s\n", "8-level");
yading@10 208 break;
yading@10 209 case ORDER_METHOD_SEARCH:
yading@10 210 av_log(avctx, AV_LOG_DEBUG, " order method: %s\n", "full search");
yading@10 211 break;
yading@10 212 case ORDER_METHOD_LOG:
yading@10 213 av_log(avctx, AV_LOG_DEBUG, " order method: %s\n", "log search");
yading@10 214 break;
yading@10 215 }
yading@10 216
yading@10 217
yading@10 218 av_log(avctx, AV_LOG_DEBUG, " partition order: %d, %d\n",
yading@10 219 opt->min_partition_order, opt->max_partition_order);
yading@10 220
yading@10 221 av_log(avctx, AV_LOG_DEBUG, " block size: %d\n", avctx->frame_size);
yading@10 222
yading@10 223 av_log(avctx, AV_LOG_DEBUG, " lpc precision: %d\n",
yading@10 224 opt->lpc_coeff_precision);
yading@10 225 }
yading@10 226
yading@10 227
yading@10 228 static av_cold int flac_encode_init(AVCodecContext *avctx)
yading@10 229 {
yading@10 230 int freq = avctx->sample_rate;
yading@10 231 int channels = avctx->channels;
yading@10 232 FlacEncodeContext *s = avctx->priv_data;
yading@10 233 int i, level, ret;
yading@10 234 uint8_t *streaminfo;
yading@10 235
yading@10 236 s->avctx = avctx;
yading@10 237
yading@10 238 switch (avctx->sample_fmt) {
yading@10 239 case AV_SAMPLE_FMT_S16:
yading@10 240 avctx->bits_per_raw_sample = 16;
yading@10 241 s->bps_code = 4;
yading@10 242 break;
yading@10 243 case AV_SAMPLE_FMT_S32:
yading@10 244 if (avctx->bits_per_raw_sample != 24)
yading@10 245 av_log(avctx, AV_LOG_WARNING, "encoding as 24 bits-per-sample\n");
yading@10 246 avctx->bits_per_raw_sample = 24;
yading@10 247 s->bps_code = 6;
yading@10 248 break;
yading@10 249 }
yading@10 250
yading@10 251 if (channels < 1 || channels > FLAC_MAX_CHANNELS) {
yading@10 252 av_log(avctx, AV_LOG_ERROR, "%d channels not supported (max %d)\n",
yading@10 253 channels, FLAC_MAX_CHANNELS);
yading@10 254 return AVERROR(EINVAL);
yading@10 255 }
yading@10 256 s->channels = channels;
yading@10 257
yading@10 258 /* find samplerate in table */
yading@10 259 if (freq < 1)
yading@10 260 return -1;
yading@10 261 for (i = 4; i < 12; i++) {
yading@10 262 if (freq == ff_flac_sample_rate_table[i]) {
yading@10 263 s->samplerate = ff_flac_sample_rate_table[i];
yading@10 264 s->sr_code[0] = i;
yading@10 265 s->sr_code[1] = 0;
yading@10 266 break;
yading@10 267 }
yading@10 268 }
yading@10 269 /* if not in table, samplerate is non-standard */
yading@10 270 if (i == 12) {
yading@10 271 if (freq % 1000 == 0 && freq < 255000) {
yading@10 272 s->sr_code[0] = 12;
yading@10 273 s->sr_code[1] = freq / 1000;
yading@10 274 } else if (freq % 10 == 0 && freq < 655350) {
yading@10 275 s->sr_code[0] = 14;
yading@10 276 s->sr_code[1] = freq / 10;
yading@10 277 } else if (freq < 65535) {
yading@10 278 s->sr_code[0] = 13;
yading@10 279 s->sr_code[1] = freq;
yading@10 280 } else {
yading@10 281 av_log(avctx, AV_LOG_ERROR, "%d Hz not supported\n", freq);
yading@10 282 return AVERROR(EINVAL);
yading@10 283 }
yading@10 284 s->samplerate = freq;
yading@10 285 }
yading@10 286
yading@10 287 /* set compression option defaults based on avctx->compression_level */
yading@10 288 if (avctx->compression_level < 0)
yading@10 289 s->options.compression_level = 5;
yading@10 290 else
yading@10 291 s->options.compression_level = avctx->compression_level;
yading@10 292
yading@10 293 level = s->options.compression_level;
yading@10 294 if (level > 12) {
yading@10 295 av_log(avctx, AV_LOG_ERROR, "invalid compression level: %d\n",
yading@10 296 s->options.compression_level);
yading@10 297 return AVERROR(EINVAL);
yading@10 298 }
yading@10 299
yading@10 300 s->options.block_time_ms = ((int[]){ 27, 27, 27,105,105,105,105,105,105,105,105,105,105})[level];
yading@10 301
yading@10 302 if (s->options.lpc_type == FF_LPC_TYPE_DEFAULT)
yading@10 303 s->options.lpc_type = ((int[]){ FF_LPC_TYPE_FIXED, FF_LPC_TYPE_FIXED, FF_LPC_TYPE_FIXED,
yading@10 304 FF_LPC_TYPE_LEVINSON, FF_LPC_TYPE_LEVINSON, FF_LPC_TYPE_LEVINSON,
yading@10 305 FF_LPC_TYPE_LEVINSON, FF_LPC_TYPE_LEVINSON, FF_LPC_TYPE_LEVINSON,
yading@10 306 FF_LPC_TYPE_LEVINSON, FF_LPC_TYPE_LEVINSON, FF_LPC_TYPE_LEVINSON,
yading@10 307 FF_LPC_TYPE_LEVINSON})[level];
yading@10 308
yading@10 309 s->options.min_prediction_order = ((int[]){ 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1})[level];
yading@10 310 s->options.max_prediction_order = ((int[]){ 3, 4, 4, 6, 8, 8, 8, 8, 12, 12, 12, 32, 32})[level];
yading@10 311
yading@10 312 if (s->options.prediction_order_method < 0)
yading@10 313 s->options.prediction_order_method = ((int[]){ ORDER_METHOD_EST, ORDER_METHOD_EST, ORDER_METHOD_EST,
yading@10 314 ORDER_METHOD_EST, ORDER_METHOD_EST, ORDER_METHOD_EST,
yading@10 315 ORDER_METHOD_4LEVEL, ORDER_METHOD_LOG, ORDER_METHOD_4LEVEL,
yading@10 316 ORDER_METHOD_LOG, ORDER_METHOD_SEARCH, ORDER_METHOD_LOG,
yading@10 317 ORDER_METHOD_SEARCH})[level];
yading@10 318
yading@10 319 if (s->options.min_partition_order > s->options.max_partition_order) {
yading@10 320 av_log(avctx, AV_LOG_ERROR, "invalid partition orders: min=%d max=%d\n",
yading@10 321 s->options.min_partition_order, s->options.max_partition_order);
yading@10 322 return AVERROR(EINVAL);
yading@10 323 }
yading@10 324 if (s->options.min_partition_order < 0)
yading@10 325 s->options.min_partition_order = ((int[]){ 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})[level];
yading@10 326 if (s->options.max_partition_order < 0)
yading@10 327 s->options.max_partition_order = ((int[]){ 2, 2, 3, 3, 3, 8, 8, 8, 8, 8, 8, 8, 8})[level];
yading@10 328
yading@10 329 if (s->options.lpc_type == FF_LPC_TYPE_NONE) {
yading@10 330 s->options.min_prediction_order = 0;
yading@10 331 } else if (avctx->min_prediction_order >= 0) {
yading@10 332 if (s->options.lpc_type == FF_LPC_TYPE_FIXED) {
yading@10 333 if (avctx->min_prediction_order > MAX_FIXED_ORDER) {
yading@10 334 av_log(avctx, AV_LOG_ERROR, "invalid min prediction order: %d\n",
yading@10 335 avctx->min_prediction_order);
yading@10 336 return AVERROR(EINVAL);
yading@10 337 }
yading@10 338 } else if (avctx->min_prediction_order < MIN_LPC_ORDER ||
yading@10 339 avctx->min_prediction_order > MAX_LPC_ORDER) {
yading@10 340 av_log(avctx, AV_LOG_ERROR, "invalid min prediction order: %d\n",
yading@10 341 avctx->min_prediction_order);
yading@10 342 return AVERROR(EINVAL);
yading@10 343 }
yading@10 344 s->options.min_prediction_order = avctx->min_prediction_order;
yading@10 345 }
yading@10 346 if (s->options.lpc_type == FF_LPC_TYPE_NONE) {
yading@10 347 s->options.max_prediction_order = 0;
yading@10 348 } else if (avctx->max_prediction_order >= 0) {
yading@10 349 if (s->options.lpc_type == FF_LPC_TYPE_FIXED) {
yading@10 350 if (avctx->max_prediction_order > MAX_FIXED_ORDER) {
yading@10 351 av_log(avctx, AV_LOG_ERROR, "invalid max prediction order: %d\n",
yading@10 352 avctx->max_prediction_order);
yading@10 353 return AVERROR(EINVAL);
yading@10 354 }
yading@10 355 } else if (avctx->max_prediction_order < MIN_LPC_ORDER ||
yading@10 356 avctx->max_prediction_order > MAX_LPC_ORDER) {
yading@10 357 av_log(avctx, AV_LOG_ERROR, "invalid max prediction order: %d\n",
yading@10 358 avctx->max_prediction_order);
yading@10 359 return AVERROR(EINVAL);
yading@10 360 }
yading@10 361 s->options.max_prediction_order = avctx->max_prediction_order;
yading@10 362 }
yading@10 363 if (s->options.max_prediction_order < s->options.min_prediction_order) {
yading@10 364 av_log(avctx, AV_LOG_ERROR, "invalid prediction orders: min=%d max=%d\n",
yading@10 365 s->options.min_prediction_order, s->options.max_prediction_order);
yading@10 366 return AVERROR(EINVAL);
yading@10 367 }
yading@10 368
yading@10 369 if (avctx->frame_size > 0) {
yading@10 370 if (avctx->frame_size < FLAC_MIN_BLOCKSIZE ||
yading@10 371 avctx->frame_size > FLAC_MAX_BLOCKSIZE) {
yading@10 372 av_log(avctx, AV_LOG_ERROR, "invalid block size: %d\n",
yading@10 373 avctx->frame_size);
yading@10 374 return AVERROR(EINVAL);
yading@10 375 }
yading@10 376 } else {
yading@10 377 s->avctx->frame_size = select_blocksize(s->samplerate, s->options.block_time_ms);
yading@10 378 }
yading@10 379 s->max_blocksize = s->avctx->frame_size;
yading@10 380
yading@10 381 /* set maximum encoded frame size in verbatim mode */
yading@10 382 s->max_framesize = ff_flac_get_max_frame_size(s->avctx->frame_size,
yading@10 383 s->channels,
yading@10 384 s->avctx->bits_per_raw_sample);
yading@10 385
yading@10 386 /* initialize MD5 context */
yading@10 387 s->md5ctx = av_md5_alloc();
yading@10 388 if (!s->md5ctx)
yading@10 389 return AVERROR(ENOMEM);
yading@10 390 av_md5_init(s->md5ctx);
yading@10 391
yading@10 392 streaminfo = av_malloc(FLAC_STREAMINFO_SIZE);
yading@10 393 if (!streaminfo)
yading@10 394 return AVERROR(ENOMEM);
yading@10 395 write_streaminfo(s, streaminfo);
yading@10 396 avctx->extradata = streaminfo;
yading@10 397 avctx->extradata_size = FLAC_STREAMINFO_SIZE;
yading@10 398
yading@10 399 s->frame_count = 0;
yading@10 400 s->min_framesize = s->max_framesize;
yading@10 401
yading@10 402 if (channels == 3 &&
yading@10 403 avctx->channel_layout != (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER) ||
yading@10 404 channels == 4 &&
yading@10 405 avctx->channel_layout != AV_CH_LAYOUT_2_2 &&
yading@10 406 avctx->channel_layout != AV_CH_LAYOUT_QUAD ||
yading@10 407 channels == 5 &&
yading@10 408 avctx->channel_layout != AV_CH_LAYOUT_5POINT0 &&
yading@10 409 avctx->channel_layout != AV_CH_LAYOUT_5POINT0_BACK ||
yading@10 410 channels == 6 &&
yading@10 411 avctx->channel_layout != AV_CH_LAYOUT_5POINT1 &&
yading@10 412 avctx->channel_layout != AV_CH_LAYOUT_5POINT1_BACK) {
yading@10 413 if (avctx->channel_layout) {
yading@10 414 av_log(avctx, AV_LOG_ERROR, "Channel layout not supported by Flac, "
yading@10 415 "output stream will have incorrect "
yading@10 416 "channel layout.\n");
yading@10 417 } else {
yading@10 418 av_log(avctx, AV_LOG_WARNING, "No channel layout specified. The encoder "
yading@10 419 "will use Flac channel layout for "
yading@10 420 "%d channels.\n", channels);
yading@10 421 }
yading@10 422 }
yading@10 423
yading@10 424 ret = ff_lpc_init(&s->lpc_ctx, avctx->frame_size,
yading@10 425 s->options.max_prediction_order, FF_LPC_TYPE_LEVINSON);
yading@10 426
yading@10 427 ff_dsputil_init(&s->dsp, avctx);
yading@10 428 ff_flacdsp_init(&s->flac_dsp, avctx->sample_fmt,
yading@10 429 avctx->bits_per_raw_sample);
yading@10 430
yading@10 431 dprint_compression_options(s);
yading@10 432
yading@10 433 return ret;
yading@10 434 }
yading@10 435
yading@10 436
yading@10 437 static void init_frame(FlacEncodeContext *s, int nb_samples)
yading@10 438 {
yading@10 439 int i, ch;
yading@10 440 FlacFrame *frame;
yading@10 441
yading@10 442 frame = &s->frame;
yading@10 443
yading@10 444 for (i = 0; i < 16; i++) {
yading@10 445 if (nb_samples == ff_flac_blocksize_table[i]) {
yading@10 446 frame->blocksize = ff_flac_blocksize_table[i];
yading@10 447 frame->bs_code[0] = i;
yading@10 448 frame->bs_code[1] = 0;
yading@10 449 break;
yading@10 450 }
yading@10 451 }
yading@10 452 if (i == 16) {
yading@10 453 frame->blocksize = nb_samples;
yading@10 454 if (frame->blocksize <= 256) {
yading@10 455 frame->bs_code[0] = 6;
yading@10 456 frame->bs_code[1] = frame->blocksize-1;
yading@10 457 } else {
yading@10 458 frame->bs_code[0] = 7;
yading@10 459 frame->bs_code[1] = frame->blocksize-1;
yading@10 460 }
yading@10 461 }
yading@10 462
yading@10 463 for (ch = 0; ch < s->channels; ch++) {
yading@10 464 FlacSubframe *sub = &frame->subframes[ch];
yading@10 465
yading@10 466 sub->wasted = 0;
yading@10 467 sub->obits = s->avctx->bits_per_raw_sample;
yading@10 468
yading@10 469 if (sub->obits > 16)
yading@10 470 sub->rc.coding_mode = CODING_MODE_RICE2;
yading@10 471 else
yading@10 472 sub->rc.coding_mode = CODING_MODE_RICE;
yading@10 473 }
yading@10 474
yading@10 475 frame->verbatim_only = 0;
yading@10 476 }
yading@10 477
yading@10 478
yading@10 479 /**
yading@10 480 * Copy channel-interleaved input samples into separate subframes.
yading@10 481 */
yading@10 482 static void copy_samples(FlacEncodeContext *s, const void *samples)
yading@10 483 {
yading@10 484 int i, j, ch;
yading@10 485 FlacFrame *frame;
yading@10 486 int shift = av_get_bytes_per_sample(s->avctx->sample_fmt) * 8 -
yading@10 487 s->avctx->bits_per_raw_sample;
yading@10 488
yading@10 489 #define COPY_SAMPLES(bits) do { \
yading@10 490 const int ## bits ## _t *samples0 = samples; \
yading@10 491 frame = &s->frame; \
yading@10 492 for (i = 0, j = 0; i < frame->blocksize; i++) \
yading@10 493 for (ch = 0; ch < s->channels; ch++, j++) \
yading@10 494 frame->subframes[ch].samples[i] = samples0[j] >> shift; \
yading@10 495 } while (0)
yading@10 496
yading@10 497 if (s->avctx->sample_fmt == AV_SAMPLE_FMT_S16)
yading@10 498 COPY_SAMPLES(16);
yading@10 499 else
yading@10 500 COPY_SAMPLES(32);
yading@10 501 }
yading@10 502
yading@10 503
yading@10 504 static uint64_t rice_count_exact(int32_t *res, int n, int k)
yading@10 505 {
yading@10 506 int i;
yading@10 507 uint64_t count = 0;
yading@10 508
yading@10 509 for (i = 0; i < n; i++) {
yading@10 510 int32_t v = -2 * res[i] - 1;
yading@10 511 v ^= v >> 31;
yading@10 512 count += (v >> k) + 1 + k;
yading@10 513 }
yading@10 514 return count;
yading@10 515 }
yading@10 516
yading@10 517
yading@10 518 static uint64_t subframe_count_exact(FlacEncodeContext *s, FlacSubframe *sub,
yading@10 519 int pred_order)
yading@10 520 {
yading@10 521 int p, porder, psize;
yading@10 522 int i, part_end;
yading@10 523 uint64_t count = 0;
yading@10 524
yading@10 525 /* subframe header */
yading@10 526 count += 8;
yading@10 527
yading@10 528 /* subframe */
yading@10 529 if (sub->type == FLAC_SUBFRAME_CONSTANT) {
yading@10 530 count += sub->obits;
yading@10 531 } else if (sub->type == FLAC_SUBFRAME_VERBATIM) {
yading@10 532 count += s->frame.blocksize * sub->obits;
yading@10 533 } else {
yading@10 534 /* warm-up samples */
yading@10 535 count += pred_order * sub->obits;
yading@10 536
yading@10 537 /* LPC coefficients */
yading@10 538 if (sub->type == FLAC_SUBFRAME_LPC)
yading@10 539 count += 4 + 5 + pred_order * s->options.lpc_coeff_precision;
yading@10 540
yading@10 541 /* rice-encoded block */
yading@10 542 count += 2;
yading@10 543
yading@10 544 /* partition order */
yading@10 545 porder = sub->rc.porder;
yading@10 546 psize = s->frame.blocksize >> porder;
yading@10 547 count += 4;
yading@10 548
yading@10 549 /* residual */
yading@10 550 i = pred_order;
yading@10 551 part_end = psize;
yading@10 552 for (p = 0; p < 1 << porder; p++) {
yading@10 553 int k = sub->rc.params[p];
yading@10 554 count += sub->rc.coding_mode;
yading@10 555 count += rice_count_exact(&sub->residual[i], part_end - i, k);
yading@10 556 i = part_end;
yading@10 557 part_end = FFMIN(s->frame.blocksize, part_end + psize);
yading@10 558 }
yading@10 559 }
yading@10 560
yading@10 561 return count;
yading@10 562 }
yading@10 563
yading@10 564
yading@10 565 #define rice_encode_count(sum, n, k) (((n)*((k)+1))+((sum-(n>>1))>>(k)))
yading@10 566
yading@10 567 /**
yading@10 568 * Solve for d/dk(rice_encode_count) = n-((sum-(n>>1))>>(k+1)) = 0.
yading@10 569 */
yading@10 570 static int find_optimal_param(uint64_t sum, int n, int max_param)
yading@10 571 {
yading@10 572 int k;
yading@10 573 uint64_t sum2;
yading@10 574
yading@10 575 if (sum <= n >> 1)
yading@10 576 return 0;
yading@10 577 sum2 = sum - (n >> 1);
yading@10 578 k = av_log2(av_clipl_int32(sum2 / n));
yading@10 579 return FFMIN(k, max_param);
yading@10 580 }
yading@10 581
yading@10 582
yading@10 583 static uint64_t calc_optimal_rice_params(RiceContext *rc, int porder,
yading@10 584 uint64_t *sums, int n, int pred_order)
yading@10 585 {
yading@10 586 int i;
yading@10 587 int k, cnt, part, max_param;
yading@10 588 uint64_t all_bits;
yading@10 589
yading@10 590 max_param = (1 << rc->coding_mode) - 2;
yading@10 591
yading@10 592 part = (1 << porder);
yading@10 593 all_bits = 4 * part;
yading@10 594
yading@10 595 cnt = (n >> porder) - pred_order;
yading@10 596 for (i = 0; i < part; i++) {
yading@10 597 k = find_optimal_param(sums[i], cnt, max_param);
yading@10 598 rc->params[i] = k;
yading@10 599 all_bits += rice_encode_count(sums[i], cnt, k);
yading@10 600 cnt = n >> porder;
yading@10 601 }
yading@10 602
yading@10 603 rc->porder = porder;
yading@10 604
yading@10 605 return all_bits;
yading@10 606 }
yading@10 607
yading@10 608
yading@10 609 static void calc_sums(int pmin, int pmax, uint32_t *data, int n, int pred_order,
yading@10 610 uint64_t sums[][MAX_PARTITIONS])
yading@10 611 {
yading@10 612 int i, j;
yading@10 613 int parts;
yading@10 614 uint32_t *res, *res_end;
yading@10 615
yading@10 616 /* sums for highest level */
yading@10 617 parts = (1 << pmax);
yading@10 618 res = &data[pred_order];
yading@10 619 res_end = &data[n >> pmax];
yading@10 620 for (i = 0; i < parts; i++) {
yading@10 621 uint64_t sum = 0;
yading@10 622 while (res < res_end)
yading@10 623 sum += *(res++);
yading@10 624 sums[pmax][i] = sum;
yading@10 625 res_end += n >> pmax;
yading@10 626 }
yading@10 627 /* sums for lower levels */
yading@10 628 for (i = pmax - 1; i >= pmin; i--) {
yading@10 629 parts = (1 << i);
yading@10 630 for (j = 0; j < parts; j++)
yading@10 631 sums[i][j] = sums[i+1][2*j] + sums[i+1][2*j+1];
yading@10 632 }
yading@10 633 }
yading@10 634
yading@10 635
yading@10 636 static uint64_t calc_rice_params(RiceContext *rc, int pmin, int pmax,
yading@10 637 int32_t *data, int n, int pred_order)
yading@10 638 {
yading@10 639 int i;
yading@10 640 uint64_t bits[MAX_PARTITION_ORDER+1];
yading@10 641 int opt_porder;
yading@10 642 RiceContext tmp_rc;
yading@10 643 uint32_t *udata;
yading@10 644 uint64_t sums[MAX_PARTITION_ORDER+1][MAX_PARTITIONS];
yading@10 645
yading@10 646 av_assert1(pmin >= 0 && pmin <= MAX_PARTITION_ORDER);
yading@10 647 av_assert1(pmax >= 0 && pmax <= MAX_PARTITION_ORDER);
yading@10 648 av_assert1(pmin <= pmax);
yading@10 649
yading@10 650 tmp_rc.coding_mode = rc->coding_mode;
yading@10 651
yading@10 652 udata = av_malloc(n * sizeof(uint32_t));
yading@10 653 for (i = 0; i < n; i++)
yading@10 654 udata[i] = (2*data[i]) ^ (data[i]>>31);
yading@10 655
yading@10 656 calc_sums(pmin, pmax, udata, n, pred_order, sums);
yading@10 657
yading@10 658 opt_porder = pmin;
yading@10 659 bits[pmin] = UINT32_MAX;
yading@10 660 for (i = pmin; i <= pmax; i++) {
yading@10 661 bits[i] = calc_optimal_rice_params(&tmp_rc, i, sums[i], n, pred_order);
yading@10 662 if (bits[i] <= bits[opt_porder]) {
yading@10 663 opt_porder = i;
yading@10 664 *rc = tmp_rc;
yading@10 665 }
yading@10 666 }
yading@10 667
yading@10 668 av_freep(&udata);
yading@10 669 return bits[opt_porder];
yading@10 670 }
yading@10 671
yading@10 672
yading@10 673 static int get_max_p_order(int max_porder, int n, int order)
yading@10 674 {
yading@10 675 int porder = FFMIN(max_porder, av_log2(n^(n-1)));
yading@10 676 if (order > 0)
yading@10 677 porder = FFMIN(porder, av_log2(n/order));
yading@10 678 return porder;
yading@10 679 }
yading@10 680
yading@10 681
yading@10 682 static uint64_t find_subframe_rice_params(FlacEncodeContext *s,
yading@10 683 FlacSubframe *sub, int pred_order)
yading@10 684 {
yading@10 685 int pmin = get_max_p_order(s->options.min_partition_order,
yading@10 686 s->frame.blocksize, pred_order);
yading@10 687 int pmax = get_max_p_order(s->options.max_partition_order,
yading@10 688 s->frame.blocksize, pred_order);
yading@10 689
yading@10 690 uint64_t bits = 8 + pred_order * sub->obits + 2 + sub->rc.coding_mode;
yading@10 691 if (sub->type == FLAC_SUBFRAME_LPC)
yading@10 692 bits += 4 + 5 + pred_order * s->options.lpc_coeff_precision;
yading@10 693 bits += calc_rice_params(&sub->rc, pmin, pmax, sub->residual,
yading@10 694 s->frame.blocksize, pred_order);
yading@10 695 return bits;
yading@10 696 }
yading@10 697
yading@10 698
yading@10 699 static void encode_residual_fixed(int32_t *res, const int32_t *smp, int n,
yading@10 700 int order)
yading@10 701 {
yading@10 702 int i;
yading@10 703
yading@10 704 for (i = 0; i < order; i++)
yading@10 705 res[i] = smp[i];
yading@10 706
yading@10 707 if (order == 0) {
yading@10 708 for (i = order; i < n; i++)
yading@10 709 res[i] = smp[i];
yading@10 710 } else if (order == 1) {
yading@10 711 for (i = order; i < n; i++)
yading@10 712 res[i] = smp[i] - smp[i-1];
yading@10 713 } else if (order == 2) {
yading@10 714 int a = smp[order-1] - smp[order-2];
yading@10 715 for (i = order; i < n; i += 2) {
yading@10 716 int b = smp[i ] - smp[i-1];
yading@10 717 res[i] = b - a;
yading@10 718 a = smp[i+1] - smp[i ];
yading@10 719 res[i+1] = a - b;
yading@10 720 }
yading@10 721 } else if (order == 3) {
yading@10 722 int a = smp[order-1] - smp[order-2];
yading@10 723 int c = smp[order-1] - 2*smp[order-2] + smp[order-3];
yading@10 724 for (i = order; i < n; i += 2) {
yading@10 725 int b = smp[i ] - smp[i-1];
yading@10 726 int d = b - a;
yading@10 727 res[i] = d - c;
yading@10 728 a = smp[i+1] - smp[i ];
yading@10 729 c = a - b;
yading@10 730 res[i+1] = c - d;
yading@10 731 }
yading@10 732 } else {
yading@10 733 int a = smp[order-1] - smp[order-2];
yading@10 734 int c = smp[order-1] - 2*smp[order-2] + smp[order-3];
yading@10 735 int e = smp[order-1] - 3*smp[order-2] + 3*smp[order-3] - smp[order-4];
yading@10 736 for (i = order; i < n; i += 2) {
yading@10 737 int b = smp[i ] - smp[i-1];
yading@10 738 int d = b - a;
yading@10 739 int f = d - c;
yading@10 740 res[i ] = f - e;
yading@10 741 a = smp[i+1] - smp[i ];
yading@10 742 c = a - b;
yading@10 743 e = c - d;
yading@10 744 res[i+1] = e - f;
yading@10 745 }
yading@10 746 }
yading@10 747 }
yading@10 748
yading@10 749
yading@10 750 static int encode_residual_ch(FlacEncodeContext *s, int ch)
yading@10 751 {
yading@10 752 int i, n;
yading@10 753 int min_order, max_order, opt_order, omethod;
yading@10 754 FlacFrame *frame;
yading@10 755 FlacSubframe *sub;
yading@10 756 int32_t coefs[MAX_LPC_ORDER][MAX_LPC_ORDER];
yading@10 757 int shift[MAX_LPC_ORDER];
yading@10 758 int32_t *res, *smp;
yading@10 759
yading@10 760 frame = &s->frame;
yading@10 761 sub = &frame->subframes[ch];
yading@10 762 res = sub->residual;
yading@10 763 smp = sub->samples;
yading@10 764 n = frame->blocksize;
yading@10 765
yading@10 766 /* CONSTANT */
yading@10 767 for (i = 1; i < n; i++)
yading@10 768 if(smp[i] != smp[0])
yading@10 769 break;
yading@10 770 if (i == n) {
yading@10 771 sub->type = sub->type_code = FLAC_SUBFRAME_CONSTANT;
yading@10 772 res[0] = smp[0];
yading@10 773 return subframe_count_exact(s, sub, 0);
yading@10 774 }
yading@10 775
yading@10 776 /* VERBATIM */
yading@10 777 if (frame->verbatim_only || n < 5) {
yading@10 778 sub->type = sub->type_code = FLAC_SUBFRAME_VERBATIM;
yading@10 779 memcpy(res, smp, n * sizeof(int32_t));
yading@10 780 return subframe_count_exact(s, sub, 0);
yading@10 781 }
yading@10 782
yading@10 783 min_order = s->options.min_prediction_order;
yading@10 784 max_order = s->options.max_prediction_order;
yading@10 785 omethod = s->options.prediction_order_method;
yading@10 786
yading@10 787 /* FIXED */
yading@10 788 sub->type = FLAC_SUBFRAME_FIXED;
yading@10 789 if (s->options.lpc_type == FF_LPC_TYPE_NONE ||
yading@10 790 s->options.lpc_type == FF_LPC_TYPE_FIXED || n <= max_order) {
yading@10 791 uint64_t bits[MAX_FIXED_ORDER+1];
yading@10 792 if (max_order > MAX_FIXED_ORDER)
yading@10 793 max_order = MAX_FIXED_ORDER;
yading@10 794 opt_order = 0;
yading@10 795 bits[0] = UINT32_MAX;
yading@10 796 for (i = min_order; i <= max_order; i++) {
yading@10 797 encode_residual_fixed(res, smp, n, i);
yading@10 798 bits[i] = find_subframe_rice_params(s, sub, i);
yading@10 799 if (bits[i] < bits[opt_order])
yading@10 800 opt_order = i;
yading@10 801 }
yading@10 802 sub->order = opt_order;
yading@10 803 sub->type_code = sub->type | sub->order;
yading@10 804 if (sub->order != max_order) {
yading@10 805 encode_residual_fixed(res, smp, n, sub->order);
yading@10 806 find_subframe_rice_params(s, sub, sub->order);
yading@10 807 }
yading@10 808 return subframe_count_exact(s, sub, sub->order);
yading@10 809 }
yading@10 810
yading@10 811 /* LPC */
yading@10 812 sub->type = FLAC_SUBFRAME_LPC;
yading@10 813 opt_order = ff_lpc_calc_coefs(&s->lpc_ctx, smp, n, min_order, max_order,
yading@10 814 s->options.lpc_coeff_precision, coefs, shift, s->options.lpc_type,
yading@10 815 s->options.lpc_passes, omethod,
yading@10 816 MAX_LPC_SHIFT, 0);
yading@10 817
yading@10 818 if (omethod == ORDER_METHOD_2LEVEL ||
yading@10 819 omethod == ORDER_METHOD_4LEVEL ||
yading@10 820 omethod == ORDER_METHOD_8LEVEL) {
yading@10 821 int levels = 1 << omethod;
yading@10 822 uint64_t bits[1 << ORDER_METHOD_8LEVEL];
yading@10 823 int order = -1;
yading@10 824 int opt_index = levels-1;
yading@10 825 opt_order = max_order-1;
yading@10 826 bits[opt_index] = UINT32_MAX;
yading@10 827 for (i = levels-1; i >= 0; i--) {
yading@10 828 int last_order = order;
yading@10 829 order = min_order + (((max_order-min_order+1) * (i+1)) / levels)-1;
yading@10 830 order = av_clip(order, min_order - 1, max_order - 1);
yading@10 831 if (order == last_order)
yading@10 832 continue;
yading@10 833 s->flac_dsp.lpc_encode(res, smp, n, order+1, coefs[order],
yading@10 834 shift[order]);
yading@10 835 bits[i] = find_subframe_rice_params(s, sub, order+1);
yading@10 836 if (bits[i] < bits[opt_index]) {
yading@10 837 opt_index = i;
yading@10 838 opt_order = order;
yading@10 839 }
yading@10 840 }
yading@10 841 opt_order++;
yading@10 842 } else if (omethod == ORDER_METHOD_SEARCH) {
yading@10 843 // brute-force optimal order search
yading@10 844 uint64_t bits[MAX_LPC_ORDER];
yading@10 845 opt_order = 0;
yading@10 846 bits[0] = UINT32_MAX;
yading@10 847 for (i = min_order-1; i < max_order; i++) {
yading@10 848 s->flac_dsp.lpc_encode(res, smp, n, i+1, coefs[i], shift[i]);
yading@10 849 bits[i] = find_subframe_rice_params(s, sub, i+1);
yading@10 850 if (bits[i] < bits[opt_order])
yading@10 851 opt_order = i;
yading@10 852 }
yading@10 853 opt_order++;
yading@10 854 } else if (omethod == ORDER_METHOD_LOG) {
yading@10 855 uint64_t bits[MAX_LPC_ORDER];
yading@10 856 int step;
yading@10 857
yading@10 858 opt_order = min_order - 1 + (max_order-min_order)/3;
yading@10 859 memset(bits, -1, sizeof(bits));
yading@10 860
yading@10 861 for (step = 16; step; step >>= 1) {
yading@10 862 int last = opt_order;
yading@10 863 for (i = last-step; i <= last+step; i += step) {
yading@10 864 if (i < min_order-1 || i >= max_order || bits[i] < UINT32_MAX)
yading@10 865 continue;
yading@10 866 s->flac_dsp.lpc_encode(res, smp, n, i+1, coefs[i], shift[i]);
yading@10 867 bits[i] = find_subframe_rice_params(s, sub, i+1);
yading@10 868 if (bits[i] < bits[opt_order])
yading@10 869 opt_order = i;
yading@10 870 }
yading@10 871 }
yading@10 872 opt_order++;
yading@10 873 }
yading@10 874
yading@10 875 sub->order = opt_order;
yading@10 876 sub->type_code = sub->type | (sub->order-1);
yading@10 877 sub->shift = shift[sub->order-1];
yading@10 878 for (i = 0; i < sub->order; i++)
yading@10 879 sub->coefs[i] = coefs[sub->order-1][i];
yading@10 880
yading@10 881 s->flac_dsp.lpc_encode(res, smp, n, sub->order, sub->coefs, sub->shift);
yading@10 882
yading@10 883 find_subframe_rice_params(s, sub, sub->order);
yading@10 884
yading@10 885 return subframe_count_exact(s, sub, sub->order);
yading@10 886 }
yading@10 887
yading@10 888
yading@10 889 static int count_frame_header(FlacEncodeContext *s)
yading@10 890 {
yading@10 891 uint8_t av_unused tmp;
yading@10 892 int count;
yading@10 893
yading@10 894 /*
yading@10 895 <14> Sync code
yading@10 896 <1> Reserved
yading@10 897 <1> Blocking strategy
yading@10 898 <4> Block size in inter-channel samples
yading@10 899 <4> Sample rate
yading@10 900 <4> Channel assignment
yading@10 901 <3> Sample size in bits
yading@10 902 <1> Reserved
yading@10 903 */
yading@10 904 count = 32;
yading@10 905
yading@10 906 /* coded frame number */
yading@10 907 PUT_UTF8(s->frame_count, tmp, count += 8;)
yading@10 908
yading@10 909 /* explicit block size */
yading@10 910 if (s->frame.bs_code[0] == 6)
yading@10 911 count += 8;
yading@10 912 else if (s->frame.bs_code[0] == 7)
yading@10 913 count += 16;
yading@10 914
yading@10 915 /* explicit sample rate */
yading@10 916 count += ((s->sr_code[0] == 12) + (s->sr_code[0] > 12)) * 8;
yading@10 917
yading@10 918 /* frame header CRC-8 */
yading@10 919 count += 8;
yading@10 920
yading@10 921 return count;
yading@10 922 }
yading@10 923
yading@10 924
yading@10 925 static int encode_frame(FlacEncodeContext *s)
yading@10 926 {
yading@10 927 int ch;
yading@10 928 uint64_t count;
yading@10 929
yading@10 930 count = count_frame_header(s);
yading@10 931
yading@10 932 for (ch = 0; ch < s->channels; ch++)
yading@10 933 count += encode_residual_ch(s, ch);
yading@10 934
yading@10 935 count += (8 - (count & 7)) & 7; // byte alignment
yading@10 936 count += 16; // CRC-16
yading@10 937
yading@10 938 count >>= 3;
yading@10 939 if (count > INT_MAX)
yading@10 940 return AVERROR_BUG;
yading@10 941 return count;
yading@10 942 }
yading@10 943
yading@10 944
yading@10 945 static void remove_wasted_bits(FlacEncodeContext *s)
yading@10 946 {
yading@10 947 int ch, i;
yading@10 948
yading@10 949 for (ch = 0; ch < s->channels; ch++) {
yading@10 950 FlacSubframe *sub = &s->frame.subframes[ch];
yading@10 951 int32_t v = 0;
yading@10 952
yading@10 953 for (i = 0; i < s->frame.blocksize; i++) {
yading@10 954 v |= sub->samples[i];
yading@10 955 if (v & 1)
yading@10 956 break;
yading@10 957 }
yading@10 958
yading@10 959 if (v && !(v & 1)) {
yading@10 960 v = av_ctz(v);
yading@10 961
yading@10 962 for (i = 0; i < s->frame.blocksize; i++)
yading@10 963 sub->samples[i] >>= v;
yading@10 964
yading@10 965 sub->wasted = v;
yading@10 966 sub->obits -= v;
yading@10 967
yading@10 968 /* for 24-bit, check if removing wasted bits makes the range better
yading@10 969 suited for using RICE instead of RICE2 for entropy coding */
yading@10 970 if (sub->obits <= 17)
yading@10 971 sub->rc.coding_mode = CODING_MODE_RICE;
yading@10 972 }
yading@10 973 }
yading@10 974 }
yading@10 975
yading@10 976
yading@10 977 static int estimate_stereo_mode(int32_t *left_ch, int32_t *right_ch, int n,
yading@10 978 int max_rice_param)
yading@10 979 {
yading@10 980 int i, best;
yading@10 981 int32_t lt, rt;
yading@10 982 uint64_t sum[4];
yading@10 983 uint64_t score[4];
yading@10 984 int k;
yading@10 985
yading@10 986 /* calculate sum of 2nd order residual for each channel */
yading@10 987 sum[0] = sum[1] = sum[2] = sum[3] = 0;
yading@10 988 for (i = 2; i < n; i++) {
yading@10 989 lt = left_ch[i] - 2*left_ch[i-1] + left_ch[i-2];
yading@10 990 rt = right_ch[i] - 2*right_ch[i-1] + right_ch[i-2];
yading@10 991 sum[2] += FFABS((lt + rt) >> 1);
yading@10 992 sum[3] += FFABS(lt - rt);
yading@10 993 sum[0] += FFABS(lt);
yading@10 994 sum[1] += FFABS(rt);
yading@10 995 }
yading@10 996 /* estimate bit counts */
yading@10 997 for (i = 0; i < 4; i++) {
yading@10 998 k = find_optimal_param(2 * sum[i], n, max_rice_param);
yading@10 999 sum[i] = rice_encode_count( 2 * sum[i], n, k);
yading@10 1000 }
yading@10 1001
yading@10 1002 /* calculate score for each mode */
yading@10 1003 score[0] = sum[0] + sum[1];
yading@10 1004 score[1] = sum[0] + sum[3];
yading@10 1005 score[2] = sum[1] + sum[3];
yading@10 1006 score[3] = sum[2] + sum[3];
yading@10 1007
yading@10 1008 /* return mode with lowest score */
yading@10 1009 best = 0;
yading@10 1010 for (i = 1; i < 4; i++)
yading@10 1011 if (score[i] < score[best])
yading@10 1012 best = i;
yading@10 1013
yading@10 1014 return best;
yading@10 1015 }
yading@10 1016
yading@10 1017
yading@10 1018 /**
yading@10 1019 * Perform stereo channel decorrelation.
yading@10 1020 */
yading@10 1021 static void channel_decorrelation(FlacEncodeContext *s)
yading@10 1022 {
yading@10 1023 FlacFrame *frame;
yading@10 1024 int32_t *left, *right;
yading@10 1025 int i, n;
yading@10 1026
yading@10 1027 frame = &s->frame;
yading@10 1028 n = frame->blocksize;
yading@10 1029 left = frame->subframes[0].samples;
yading@10 1030 right = frame->subframes[1].samples;
yading@10 1031
yading@10 1032 if (s->channels != 2) {
yading@10 1033 frame->ch_mode = FLAC_CHMODE_INDEPENDENT;
yading@10 1034 return;
yading@10 1035 }
yading@10 1036
yading@10 1037 if (s->options.ch_mode < 0) {
yading@10 1038 int max_rice_param = (1 << frame->subframes[0].rc.coding_mode) - 2;
yading@10 1039 frame->ch_mode = estimate_stereo_mode(left, right, n, max_rice_param);
yading@10 1040 } else
yading@10 1041 frame->ch_mode = s->options.ch_mode;
yading@10 1042
yading@10 1043 /* perform decorrelation and adjust bits-per-sample */
yading@10 1044 if (frame->ch_mode == FLAC_CHMODE_INDEPENDENT)
yading@10 1045 return;
yading@10 1046 if (frame->ch_mode == FLAC_CHMODE_MID_SIDE) {
yading@10 1047 int32_t tmp;
yading@10 1048 for (i = 0; i < n; i++) {
yading@10 1049 tmp = left[i];
yading@10 1050 left[i] = (tmp + right[i]) >> 1;
yading@10 1051 right[i] = tmp - right[i];
yading@10 1052 }
yading@10 1053 frame->subframes[1].obits++;
yading@10 1054 } else if (frame->ch_mode == FLAC_CHMODE_LEFT_SIDE) {
yading@10 1055 for (i = 0; i < n; i++)
yading@10 1056 right[i] = left[i] - right[i];
yading@10 1057 frame->subframes[1].obits++;
yading@10 1058 } else {
yading@10 1059 for (i = 0; i < n; i++)
yading@10 1060 left[i] -= right[i];
yading@10 1061 frame->subframes[0].obits++;
yading@10 1062 }
yading@10 1063 }
yading@10 1064
yading@10 1065
yading@10 1066 static void write_utf8(PutBitContext *pb, uint32_t val)
yading@10 1067 {
yading@10 1068 uint8_t tmp;
yading@10 1069 PUT_UTF8(val, tmp, put_bits(pb, 8, tmp);)
yading@10 1070 }
yading@10 1071
yading@10 1072
yading@10 1073 static void write_frame_header(FlacEncodeContext *s)
yading@10 1074 {
yading@10 1075 FlacFrame *frame;
yading@10 1076 int crc;
yading@10 1077
yading@10 1078 frame = &s->frame;
yading@10 1079
yading@10 1080 put_bits(&s->pb, 16, 0xFFF8);
yading@10 1081 put_bits(&s->pb, 4, frame->bs_code[0]);
yading@10 1082 put_bits(&s->pb, 4, s->sr_code[0]);
yading@10 1083
yading@10 1084 if (frame->ch_mode == FLAC_CHMODE_INDEPENDENT)
yading@10 1085 put_bits(&s->pb, 4, s->channels-1);
yading@10 1086 else
yading@10 1087 put_bits(&s->pb, 4, frame->ch_mode + FLAC_MAX_CHANNELS - 1);
yading@10 1088
yading@10 1089 put_bits(&s->pb, 3, s->bps_code);
yading@10 1090 put_bits(&s->pb, 1, 0);
yading@10 1091 write_utf8(&s->pb, s->frame_count);
yading@10 1092
yading@10 1093 if (frame->bs_code[0] == 6)
yading@10 1094 put_bits(&s->pb, 8, frame->bs_code[1]);
yading@10 1095 else if (frame->bs_code[0] == 7)
yading@10 1096 put_bits(&s->pb, 16, frame->bs_code[1]);
yading@10 1097
yading@10 1098 if (s->sr_code[0] == 12)
yading@10 1099 put_bits(&s->pb, 8, s->sr_code[1]);
yading@10 1100 else if (s->sr_code[0] > 12)
yading@10 1101 put_bits(&s->pb, 16, s->sr_code[1]);
yading@10 1102
yading@10 1103 flush_put_bits(&s->pb);
yading@10 1104 crc = av_crc(av_crc_get_table(AV_CRC_8_ATM), 0, s->pb.buf,
yading@10 1105 put_bits_count(&s->pb) >> 3);
yading@10 1106 put_bits(&s->pb, 8, crc);
yading@10 1107 }
yading@10 1108
yading@10 1109
yading@10 1110 static void write_subframes(FlacEncodeContext *s)
yading@10 1111 {
yading@10 1112 int ch;
yading@10 1113
yading@10 1114 for (ch = 0; ch < s->channels; ch++) {
yading@10 1115 FlacSubframe *sub = &s->frame.subframes[ch];
yading@10 1116 int i, p, porder, psize;
yading@10 1117 int32_t *part_end;
yading@10 1118 int32_t *res = sub->residual;
yading@10 1119 int32_t *frame_end = &sub->residual[s->frame.blocksize];
yading@10 1120
yading@10 1121 /* subframe header */
yading@10 1122 put_bits(&s->pb, 1, 0);
yading@10 1123 put_bits(&s->pb, 6, sub->type_code);
yading@10 1124 put_bits(&s->pb, 1, !!sub->wasted);
yading@10 1125 if (sub->wasted)
yading@10 1126 put_bits(&s->pb, sub->wasted, 1);
yading@10 1127
yading@10 1128 /* subframe */
yading@10 1129 if (sub->type == FLAC_SUBFRAME_CONSTANT) {
yading@10 1130 put_sbits(&s->pb, sub->obits, res[0]);
yading@10 1131 } else if (sub->type == FLAC_SUBFRAME_VERBATIM) {
yading@10 1132 while (res < frame_end)
yading@10 1133 put_sbits(&s->pb, sub->obits, *res++);
yading@10 1134 } else {
yading@10 1135 /* warm-up samples */
yading@10 1136 for (i = 0; i < sub->order; i++)
yading@10 1137 put_sbits(&s->pb, sub->obits, *res++);
yading@10 1138
yading@10 1139 /* LPC coefficients */
yading@10 1140 if (sub->type == FLAC_SUBFRAME_LPC) {
yading@10 1141 int cbits = s->options.lpc_coeff_precision;
yading@10 1142 put_bits( &s->pb, 4, cbits-1);
yading@10 1143 put_sbits(&s->pb, 5, sub->shift);
yading@10 1144 for (i = 0; i < sub->order; i++)
yading@10 1145 put_sbits(&s->pb, cbits, sub->coefs[i]);
yading@10 1146 }
yading@10 1147
yading@10 1148 /* rice-encoded block */
yading@10 1149 put_bits(&s->pb, 2, sub->rc.coding_mode - 4);
yading@10 1150
yading@10 1151 /* partition order */
yading@10 1152 porder = sub->rc.porder;
yading@10 1153 psize = s->frame.blocksize >> porder;
yading@10 1154 put_bits(&s->pb, 4, porder);
yading@10 1155
yading@10 1156 /* residual */
yading@10 1157 part_end = &sub->residual[psize];
yading@10 1158 for (p = 0; p < 1 << porder; p++) {
yading@10 1159 int k = sub->rc.params[p];
yading@10 1160 put_bits(&s->pb, sub->rc.coding_mode, k);
yading@10 1161 while (res < part_end)
yading@10 1162 set_sr_golomb_flac(&s->pb, *res++, k, INT32_MAX, 0);
yading@10 1163 part_end = FFMIN(frame_end, part_end + psize);
yading@10 1164 }
yading@10 1165 }
yading@10 1166 }
yading@10 1167 }
yading@10 1168
yading@10 1169
yading@10 1170 static void write_frame_footer(FlacEncodeContext *s)
yading@10 1171 {
yading@10 1172 int crc;
yading@10 1173 flush_put_bits(&s->pb);
yading@10 1174 crc = av_bswap16(av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, s->pb.buf,
yading@10 1175 put_bits_count(&s->pb)>>3));
yading@10 1176 put_bits(&s->pb, 16, crc);
yading@10 1177 flush_put_bits(&s->pb);
yading@10 1178 }
yading@10 1179
yading@10 1180
yading@10 1181 static int write_frame(FlacEncodeContext *s, AVPacket *avpkt)
yading@10 1182 {
yading@10 1183 init_put_bits(&s->pb, avpkt->data, avpkt->size);
yading@10 1184 write_frame_header(s);
yading@10 1185 write_subframes(s);
yading@10 1186 write_frame_footer(s);
yading@10 1187 return put_bits_count(&s->pb) >> 3;
yading@10 1188 }
yading@10 1189
yading@10 1190
yading@10 1191 static int update_md5_sum(FlacEncodeContext *s, const void *samples)
yading@10 1192 {
yading@10 1193 const uint8_t *buf;
yading@10 1194 int buf_size = s->frame.blocksize * s->channels *
yading@10 1195 ((s->avctx->bits_per_raw_sample + 7) / 8);
yading@10 1196
yading@10 1197 if (s->avctx->bits_per_raw_sample > 16 || HAVE_BIGENDIAN) {
yading@10 1198 av_fast_malloc(&s->md5_buffer, &s->md5_buffer_size, buf_size);
yading@10 1199 if (!s->md5_buffer)
yading@10 1200 return AVERROR(ENOMEM);
yading@10 1201 }
yading@10 1202
yading@10 1203 if (s->avctx->bits_per_raw_sample <= 16) {
yading@10 1204 buf = (const uint8_t *)samples;
yading@10 1205 #if HAVE_BIGENDIAN
yading@10 1206 s->dsp.bswap16_buf((uint16_t *)s->md5_buffer,
yading@10 1207 (const uint16_t *)samples, buf_size / 2);
yading@10 1208 buf = s->md5_buffer;
yading@10 1209 #endif
yading@10 1210 } else {
yading@10 1211 int i;
yading@10 1212 const int32_t *samples0 = samples;
yading@10 1213 uint8_t *tmp = s->md5_buffer;
yading@10 1214
yading@10 1215 for (i = 0; i < s->frame.blocksize * s->channels; i++) {
yading@10 1216 int32_t v = samples0[i] >> 8;
yading@10 1217 *tmp++ = (v ) & 0xFF;
yading@10 1218 *tmp++ = (v >> 8) & 0xFF;
yading@10 1219 *tmp++ = (v >> 16) & 0xFF;
yading@10 1220 }
yading@10 1221 buf = s->md5_buffer;
yading@10 1222 }
yading@10 1223 av_md5_update(s->md5ctx, buf, buf_size);
yading@10 1224
yading@10 1225 return 0;
yading@10 1226 }
yading@10 1227
yading@10 1228
yading@10 1229 static int flac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
yading@10 1230 const AVFrame *frame, int *got_packet_ptr)
yading@10 1231 {
yading@10 1232 FlacEncodeContext *s;
yading@10 1233 int frame_bytes, out_bytes, ret;
yading@10 1234
yading@10 1235 s = avctx->priv_data;
yading@10 1236
yading@10 1237 /* when the last block is reached, update the header in extradata */
yading@10 1238 if (!frame) {
yading@10 1239 s->max_framesize = s->max_encoded_framesize;
yading@10 1240 av_md5_final(s->md5ctx, s->md5sum);
yading@10 1241 write_streaminfo(s, avctx->extradata);
yading@10 1242 return 0;
yading@10 1243 }
yading@10 1244
yading@10 1245 /* change max_framesize for small final frame */
yading@10 1246 if (frame->nb_samples < s->frame.blocksize) {
yading@10 1247 s->max_framesize = ff_flac_get_max_frame_size(frame->nb_samples,
yading@10 1248 s->channels,
yading@10 1249 avctx->bits_per_raw_sample);
yading@10 1250 }
yading@10 1251
yading@10 1252 init_frame(s, frame->nb_samples);
yading@10 1253
yading@10 1254 copy_samples(s, frame->data[0]);
yading@10 1255
yading@10 1256 channel_decorrelation(s);
yading@10 1257
yading@10 1258 remove_wasted_bits(s);
yading@10 1259
yading@10 1260 frame_bytes = encode_frame(s);
yading@10 1261
yading@10 1262 /* fallback to verbatim mode if the compressed frame is larger than it
yading@10 1263 would be if encoded uncompressed. */
yading@10 1264 if (frame_bytes < 0 || frame_bytes > s->max_framesize) {
yading@10 1265 s->frame.verbatim_only = 1;
yading@10 1266 frame_bytes = encode_frame(s);
yading@10 1267 if (frame_bytes < 0) {
yading@10 1268 av_log(avctx, AV_LOG_ERROR, "Bad frame count\n");
yading@10 1269 return frame_bytes;
yading@10 1270 }
yading@10 1271 }
yading@10 1272
yading@10 1273 if ((ret = ff_alloc_packet2(avctx, avpkt, frame_bytes)) < 0)
yading@10 1274 return ret;
yading@10 1275
yading@10 1276 out_bytes = write_frame(s, avpkt);
yading@10 1277
yading@10 1278 s->frame_count++;
yading@10 1279 s->sample_count += frame->nb_samples;
yading@10 1280 if ((ret = update_md5_sum(s, frame->data[0])) < 0) {
yading@10 1281 av_log(avctx, AV_LOG_ERROR, "Error updating MD5 checksum\n");
yading@10 1282 return ret;
yading@10 1283 }
yading@10 1284 if (out_bytes > s->max_encoded_framesize)
yading@10 1285 s->max_encoded_framesize = out_bytes;
yading@10 1286 if (out_bytes < s->min_framesize)
yading@10 1287 s->min_framesize = out_bytes;
yading@10 1288
yading@10 1289 avpkt->pts = frame->pts;
yading@10 1290 avpkt->duration = ff_samples_to_time_base(avctx, frame->nb_samples);
yading@10 1291 avpkt->size = out_bytes;
yading@10 1292 *got_packet_ptr = 1;
yading@10 1293 return 0;
yading@10 1294 }
yading@10 1295
yading@10 1296
yading@10 1297 static av_cold int flac_encode_close(AVCodecContext *avctx)
yading@10 1298 {
yading@10 1299 if (avctx->priv_data) {
yading@10 1300 FlacEncodeContext *s = avctx->priv_data;
yading@10 1301 av_freep(&s->md5ctx);
yading@10 1302 av_freep(&s->md5_buffer);
yading@10 1303 ff_lpc_end(&s->lpc_ctx);
yading@10 1304 }
yading@10 1305 av_freep(&avctx->extradata);
yading@10 1306 avctx->extradata_size = 0;
yading@10 1307 return 0;
yading@10 1308 }
yading@10 1309
yading@10 1310 #define FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM
yading@10 1311 static const AVOption options[] = {
yading@10 1312 { "lpc_coeff_precision", "LPC coefficient precision", offsetof(FlacEncodeContext, options.lpc_coeff_precision), AV_OPT_TYPE_INT, {.i64 = 15 }, 0, MAX_LPC_PRECISION, FLAGS },
yading@10 1313 { "lpc_type", "LPC algorithm", offsetof(FlacEncodeContext, options.lpc_type), AV_OPT_TYPE_INT, {.i64 = FF_LPC_TYPE_DEFAULT }, FF_LPC_TYPE_DEFAULT, FF_LPC_TYPE_NB-1, FLAGS, "lpc_type" },
yading@10 1314 { "none", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_LPC_TYPE_NONE }, INT_MIN, INT_MAX, FLAGS, "lpc_type" },
yading@10 1315 { "fixed", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_LPC_TYPE_FIXED }, INT_MIN, INT_MAX, FLAGS, "lpc_type" },
yading@10 1316 { "levinson", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_LPC_TYPE_LEVINSON }, INT_MIN, INT_MAX, FLAGS, "lpc_type" },
yading@10 1317 { "cholesky", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_LPC_TYPE_CHOLESKY }, INT_MIN, INT_MAX, FLAGS, "lpc_type" },
yading@10 1318 { "lpc_passes", "Number of passes to use for Cholesky factorization during LPC analysis", offsetof(FlacEncodeContext, options.lpc_passes), AV_OPT_TYPE_INT, {.i64 = 2 }, 1, INT_MAX, FLAGS },
yading@10 1319 { "min_partition_order", NULL, offsetof(FlacEncodeContext, options.min_partition_order), AV_OPT_TYPE_INT, {.i64 = -1 }, -1, MAX_PARTITION_ORDER, FLAGS },
yading@10 1320 { "max_partition_order", NULL, offsetof(FlacEncodeContext, options.max_partition_order), AV_OPT_TYPE_INT, {.i64 = -1 }, -1, MAX_PARTITION_ORDER, FLAGS },
yading@10 1321 { "prediction_order_method", "Search method for selecting prediction order", offsetof(FlacEncodeContext, options.prediction_order_method), AV_OPT_TYPE_INT, {.i64 = -1 }, -1, ORDER_METHOD_LOG, FLAGS, "predm" },
yading@10 1322 { "estimation", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = ORDER_METHOD_EST }, INT_MIN, INT_MAX, FLAGS, "predm" },
yading@10 1323 { "2level", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = ORDER_METHOD_2LEVEL }, INT_MIN, INT_MAX, FLAGS, "predm" },
yading@10 1324 { "4level", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = ORDER_METHOD_4LEVEL }, INT_MIN, INT_MAX, FLAGS, "predm" },
yading@10 1325 { "8level", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = ORDER_METHOD_8LEVEL }, INT_MIN, INT_MAX, FLAGS, "predm" },
yading@10 1326 { "search", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = ORDER_METHOD_SEARCH }, INT_MIN, INT_MAX, FLAGS, "predm" },
yading@10 1327 { "log", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = ORDER_METHOD_LOG }, INT_MIN, INT_MAX, FLAGS, "predm" },
yading@10 1328 { "ch_mode", "Stereo decorrelation mode", offsetof(FlacEncodeContext, options.ch_mode), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, FLAC_CHMODE_MID_SIDE, FLAGS, "ch_mode" },
yading@10 1329 { "auto", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = -1 }, INT_MIN, INT_MAX, FLAGS, "ch_mode" },
yading@10 1330 { "indep", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FLAC_CHMODE_INDEPENDENT }, INT_MIN, INT_MAX, FLAGS, "ch_mode" },
yading@10 1331 { "left_side", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FLAC_CHMODE_LEFT_SIDE }, INT_MIN, INT_MAX, FLAGS, "ch_mode" },
yading@10 1332 { "right_side", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FLAC_CHMODE_RIGHT_SIDE }, INT_MIN, INT_MAX, FLAGS, "ch_mode" },
yading@10 1333 { "mid_side", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FLAC_CHMODE_MID_SIDE }, INT_MIN, INT_MAX, FLAGS, "ch_mode" },
yading@10 1334 { NULL },
yading@10 1335 };
yading@10 1336
yading@10 1337 static const AVClass flac_encoder_class = {
yading@10 1338 "FLAC encoder",
yading@10 1339 av_default_item_name,
yading@10 1340 options,
yading@10 1341 LIBAVUTIL_VERSION_INT,
yading@10 1342 };
yading@10 1343
yading@10 1344 AVCodec ff_flac_encoder = {
yading@10 1345 .name = "flac",
yading@10 1346 .type = AVMEDIA_TYPE_AUDIO,
yading@10 1347 .id = AV_CODEC_ID_FLAC,
yading@10 1348 .priv_data_size = sizeof(FlacEncodeContext),
yading@10 1349 .init = flac_encode_init,
yading@10 1350 .encode2 = flac_encode_frame,
yading@10 1351 .close = flac_encode_close,
yading@10 1352 .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY | CODEC_CAP_LOSSLESS,
yading@10 1353 .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
yading@10 1354 AV_SAMPLE_FMT_S32,
yading@10 1355 AV_SAMPLE_FMT_NONE },
yading@10 1356 .long_name = NULL_IF_CONFIG_SMALL("FLAC (Free Lossless Audio Codec)"),
yading@10 1357 .priv_class = &flac_encoder_class,
yading@10 1358 };