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