即日是什么意思| 疤痕增生是什么原因| 什么是气短| 王爷的儿子叫什么| 光绪帝叫什么名字| 军区司令是什么级别| 肠息肉是什么原因引起的| 月经一直不干净是什么原因| 常吃南瓜子有什么好处和坏处| 一金有什么用| 吃什么补血补气最快| 胸膜炎吃什么消炎药| 马来西亚人为什么会说中文| 女人喝黄酒有什么好处| 阴虚火旺是什么症状| 腰子是什么| ags是什么意思| 老年人头晕挂什么科| 伐木累是什么意思| 湿肺是什么意思| 切片是什么| 葡萄是什么季节的水果| 乙肝1245阳性什么意思| 10年是什么年| 肺和大肠相表里是什么意思| 脑梗是由什么引起的| 女人喝黄连有什么好处| 什么是射精| 2021是什么年| 黄连膏有什么功效和作用| 桃花灼灼什么意思| 为什么会得抑郁症| 什么是百分数| 青椒炒什么好吃| 32周孕检检查什么项目| 826是什么星座| 724是什么意思| 49岁属什么| 心律不齐用什么药| 白血球低吃什么补得快| 嘴唇干是什么原因| 五阴是什么| 山海经讲的是什么| 薄荷叶晒干后能干什么| 1936年属什么生肖| 1月24日是什么星座| 解脲支原体阳性吃什么药最好| rca是什么意思| 核桃什么时候吃最好| 大殓是什么意思| 狗和什么属相相冲| 性侵是什么意思| 更年期失眠吃什么药调理效果好| 老妈子是什么意思| 为什么空调外机不转| 单核细胞比率偏高说明什么| 巴宝莉是什么牌子| 家里进黄鼠狼是什么预兆| 眼睛红血丝是什么原因| 女人大腿内侧黑是什么原因引起的| 眼睛疲劳干涩用什么眼药水| 配制酒是什么意思| 今年78岁属什么生肖| 3月23日是什么星座| 十月十九是什么星座| 老鼠长什么样| 赤小豆是什么| 经常抽筋是什么原因| boby是什么意思| 紫癜是什么原因引起的| 命理是什么意思| 睾丸扭转是什么意思| 什么降压药副作用小且效果最好| 腱鞘炎有什么治疗方法| 糖类抗原是检查什么的| 过敏性紫癜是什么病| 肝肿瘤不能吃什么| 女性排卵期一般在什么时候| 南宁晚上有什么好玩的地方| 内分泌是什么意思| 真言是什么意思| 白玫瑰花语是什么意思| 摇粒绒是什么面料| 镜面是什么意思| 胃胀胃酸是什么原因| 理想主义是什么意思| 什么什么斑斓| 头骨凹陷是什么原因| 什么是备皮| 六月初二是什么日子| 王字旁行念什么| 吃什么放屁多| 梦到前女友征兆是什么| 偏头痛有什么症状| 达菲是什么药| 石斛有什么副作用| 唯美什么意思| 练瑜伽有什么好处| 什么原因造成痫性发作| 来来来喝完这杯还有三杯是什么歌| 姜红枣红糖一起煮有什么效果| 劳燕分飞是什么意思| 来龙去脉是什么意思| 8月11是什么星座| 甲胄是什么意思| 嫩绿的什么| 苦瓜有什么功效和作用| 小肝癌是什么意思| 慢性胃炎可以吃什么水果| 眉心长痘痘什么原因| 氮气是什么| 为什么吃西瓜会拉肚子| noon什么意思| 心包积液吃什么药| 乌鸡不能和什么一起吃| 鸾凤和鸣什么意思| 脆皮鸭什么意思| 什么器官分泌胰岛素| 玉帝和王母是什么关系| 小儿流清鼻涕吃什么药效果好| 农历七月十五是什么节| 坐月子送什么礼物好| 12月7日是什么星座| 今天冬至吃什么| 什么发什么强| 新生儿便秘吃什么好| 孕期同房需要注意什么| 阳痿有什么症状| 聚乙二醇是什么| 此生不换什么意思| 玄学是什么| 无名指戴戒指什么意思| 过期的酸奶有什么用| 1962年属虎的是什么命| 教授相当于什么级别| 失去理智什么意思| al是什么| 郑州机场叫什么名字| 胃肠功能紊乱是什么意思| 医保和农村合作医疗有什么区别| 水由什么构成| 早泄吃什么药| 乌龟喜欢吃什么| 妄念是什么意思| 也字少一竖念什么| mm什么意思| 蛋白粉有什么营养| 胸闷气短吃什么特效药| 嘉靖为什么不杀严嵩| 早上做什么运动最好| 江团鱼又叫什么鱼| 肾积水吃什么药| 3.1415926是什么意思| 腺样体挂什么科| 麒麟是什么| 炖肉放什么调料| 9-11点是什么时辰| d是什么| 牙膏什么牌子最好| 鼻子里面痒是什么原因| 喉咙发痒吃什么药| 月亏念什么| 肌肉酸痛吃什么药| 头发变棕色是什么原因| 手脚麻木吃什么药| 白带黄色是什么原因| 全运会是什么| 大连机场叫什么名字| 什么是骨科| 慢性非萎缩性胃炎伴糜烂是什么意思| 眩晕症是什么症状| 慢性咽炎是什么症状| 花胶和什么煲汤最适合| 为什么会胃疼| 坐骨神经有什么症状| 有机蔬菜是什么意思| 女性肠痉挛有什么症状| 石榴花什么时候开花| 寄大件用什么物流便宜| dtc什么意思| 粘假牙用什么胶| 鸟为什么会飞| 总蛋白低是什么意思| 牛蹄筋炖什么好吃| 乳腺炎吃什么消炎药| 异禀是什么意思| 喝完酒吃点什么对胃好| 手臂肌肉跳动是什么原因| 果酸是什么东西| 鼻子上火吃什么药| 总胆汁酸是什么意思| 29是什么生肖| 旅游有什么好处| 女性经常手淫有什么危害| 河里的贝壳叫什么| sf什么意思| 压马路是什么意思| a型血的孩子父母是什么血型| 左侧上颌窦炎是什么病| 属羊的是什么星座| 成何体统是什么意思| nda是什么意思| 血管夹层是什么病| 脊髓空洞是什么意思| 细菌性结膜炎用什么眼药水| 孙楠留什么给你| 大暑是什么时候| 妈妈的姐姐叫什么| 宁字属于五行属什么| 吃什么食物能升白细胞| 人比黄花瘦是什么意思| 月经总是提前是什么原因| 鸡咳嗽吃什么药| 印度什么教| goldlion是什么牌子| 免疫球蛋白有什么作用| 子宫前位什么姿势易孕| 吃什么补维生素d| 苹果煮水喝有什么功效| 梦到丢了一只鞋是什么意思| 睡眠不好挂什么科门诊| 为什么订婚后容易分手| 夜郎自大是什么意思| 什么茶不能喝脑筋急转弯| 尧五行属什么| 为什么嘴唇发紫| 11月14号什么星座| 钙化点是什么意思| 打破伤风针挂什么科| 三羊开泰什么意思| 本加一笔是什么字| 产后吃什么水果好| 牙龈出血是什么原因| 广东话扑街是什么意思| 1级高血压是什么意思| star什么意思| 乳房有溢液是什么原因| 出虚汗吃什么药| 胃复安是什么药| 人彘是什么| ipa啤酒什么意思| 小腿出汗是什么原因| 继发性肺结核是什么意思| 用什么泡水喝可以降血压| 什么叫真丝| 你有什么| 卵泡不破是什么原因| 黄芪长什么样子| 喝什么茶去湿气最好| 犬和狗有什么区别| 当归有什么作用| 早上做什么运动最好| 膀胱炎吃什么药好得快| 肖战什么星座| 乌龟和甲鱼有什么区别| t恤搭配什么裤子好看| 尿味道很重是什么原因| 黄精为什么要九蒸九晒| 游离三碘甲状腺原氨酸是什么意思| 浸润癌是什么意思| 尿气味重是什么原因| 绞股蓝长什么样子| 玉髓什么颜色最贵| 积液是什么原因造成的怎么治疗| 百度

(两会受权发布)政府工作报告


Directory: ../../../ffmpeg/
File: src/libavcodec/flacenc.c
Date: 2025-08-04 00:43:16
Exec Total Coverage
Lines: 722 850 84.9%
Functions: 36 38 94.7%
Branches: 401 617 65.0%

Line Branch Exec Source
1 /*
2 * FLAC audio encoder
3 * Copyright (c) 2006 Justin Ruggles <justin.ruggles@gmail.com>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 #include "libavutil/avassert.h"
23 #include "libavutil/channel_layout.h"
24 #include "libavutil/crc.h"
25 #include "libavutil/intmath.h"
26 #include "libavutil/md5.h"
27 #include "libavutil/mem.h"
28 #include "libavutil/opt.h"
29
30 #include "avcodec.h"
31 #include "bswapdsp.h"
32 #include "codec_internal.h"
33 #include "encode.h"
34 #include "put_bits.h"
35 #include "lpc.h"
36 #include "flac.h"
37 #include "flacdata.h"
38 #include "flacencdsp.h"
39
40 #define FLAC_SUBFRAME_CONSTANT 0
41 #define FLAC_SUBFRAME_VERBATIM 1
42 #define FLAC_SUBFRAME_FIXED 8
43 #define FLAC_SUBFRAME_LPC 32
44
45 #define MAX_FIXED_ORDER 4
46 #define MAX_PARTITION_ORDER 8
47 #define MAX_PARTITIONS (1 << MAX_PARTITION_ORDER)
48 #define MAX_LPC_PRECISION 15
49 #define MIN_LPC_SHIFT 0
50 #define MAX_LPC_SHIFT 15
51
52 enum CodingMode {
53 CODING_MODE_RICE = 4,
54 CODING_MODE_RICE2 = 5,
55 };
56
57 typedef struct CompressionOptions {
58 int compression_level;
59 int block_time_ms;
60 enum FFLPCType lpc_type;
61 int lpc_passes;
62 int lpc_coeff_precision;
63 int min_prediction_order;
64 int max_prediction_order;
65 int prediction_order_method;
66 int min_partition_order;
67 int max_partition_order;
68 int ch_mode;
69 int exact_rice_parameters;
70 int multi_dim_quant;
71 } CompressionOptions;
72
73 typedef struct RiceContext {
74 enum CodingMode coding_mode;
75 int porder;
76 int params[MAX_PARTITIONS];
77 } RiceContext;
78
79 typedef struct FlacSubframe {
80 int type;
81 int type_code;
82 int obits;
83 int wasted;
84 int order;
85 int32_t coefs[MAX_LPC_ORDER];
86 int shift;
87
88 RiceContext rc;
89 uint32_t rc_udata[FLAC_MAX_BLOCKSIZE];
90 uint64_t rc_sums[32][MAX_PARTITIONS];
91
92 int32_t samples[FLAC_MAX_BLOCKSIZE];
93 int32_t residual[FLAC_MAX_BLOCKSIZE+11];
94 } FlacSubframe;
95
96 typedef struct FlacFrame {
97 FlacSubframe subframes[FLAC_MAX_CHANNELS];
98 int64_t samples_33bps[FLAC_MAX_BLOCKSIZE];
99 int blocksize;
100 int bs_code[2];
101 uint8_t crc8;
102 int ch_mode;
103 int verbatim_only;
104 } FlacFrame;
105
106 typedef struct FlacEncodeContext {
107 AVClass *class;
108 PutBitContext pb;
109 int channels;
110 int samplerate;
111 int sr_code[2];
112 int bps_code;
113 int max_blocksize;
114 int min_framesize;
115 int max_framesize;
116 int max_encoded_framesize;
117 uint32_t frame_count;
118 uint64_t sample_count;
119 uint8_t md5sum[16];
120 FlacFrame frame;
121 CompressionOptions options;
122 AVCodecContext *avctx;
123 LPCContext lpc_ctx;
124 struct AVMD5 *md5ctx;
125 uint8_t *md5_buffer;
126 unsigned int md5_buffer_size;
127 BswapDSPContext bdsp;
128 FLACEncDSPContext flac_dsp;
129
130 int flushed;
131 int64_t next_pts;
132 } FlacEncodeContext;
133
134
135 /**
136 * Write streaminfo metadata block to byte array.
137 */
138 226 static void write_streaminfo(FlacEncodeContext *s, uint8_t *header)
139 {
140 PutBitContext pb;
141
142 226 memset(header, 0, FLAC_STREAMINFO_SIZE);
143 226 init_put_bits(&pb, header, FLAC_STREAMINFO_SIZE);
144
145 /* streaminfo metadata block */
146 226 put_bits(&pb, 16, s->max_blocksize);
147 226 put_bits(&pb, 16, s->max_blocksize);
148 226 put_bits(&pb, 24, s->min_framesize);
149 226 put_bits(&pb, 24, s->max_framesize);
150 226 put_bits(&pb, 20, s->samplerate);
151 226 put_bits(&pb, 3, s->channels-1);
152 226 put_bits(&pb, 5, s->avctx->bits_per_raw_sample - 1);
153 /* write 36-bit sample count in 2 put_bits() calls */
154 226 put_bits(&pb, 24, (s->sample_count & 0xFFFFFF000LL) >> 12);
155 226 put_bits(&pb, 12, s->sample_count & 0x000000FFFLL);
156 226 flush_put_bits(&pb);
157 226 memcpy(&header[18], s->md5sum, 16);
158 226 }
159
160
161 /**
162 * Calculate an estimate for the maximum frame size based on verbatim mode.
163 * @param blocksize block size, in samples
164 * @param ch number of channels
165 * @param bps bits-per-sample
166 */
167 153 static int flac_get_max_frame_size(int blocksize, int ch, int bps)
168 {
169 /* Technically, there is no limit to FLAC frame size, but an encoder
170 should not write a frame that is larger than if verbatim encoding mode
171 were to be used. */
172
173 int count;
174
175 153 count = 16; /* frame header */
176 153 count += ch * ((7+bps+7)/8); /* subframe headers */
177
2/2
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 53 times.
153 if (ch == 2) {
178 /* for stereo, need to account for using decorrelation */
179 100 count += (( 2*bps+1) * blocksize + 7) / 8;
180 } else {
181 53 count += ( ch*bps * blocksize + 7) / 8;
182 }
183 153 count += 2; /* frame footer */
184
185 153 return count;
186 }
187
188
189 /**
190 * Set blocksize based on samplerate.
191 * Choose the closest predefined blocksize >= BLOCK_TIME_MS milliseconds.
192 */
193 86 static int select_blocksize(int samplerate, int block_time_ms)
194 {
195 int i;
196 int target;
197 int blocksize;
198
199
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 86 times.
86 av_assert0(samplerate > 0);
200 86 blocksize = ff_flac_blocksize_table[1];
201 86 target = (samplerate * block_time_ms) / 1000;
202
2/2
✓ Branch 0 taken 1376 times.
✓ Branch 1 taken 86 times.
1462 for (i = 0; i < 16; i++) {
203
2/2
✓ Branch 0 taken 1096 times.
✓ Branch 1 taken 280 times.
1376 if (target >= ff_flac_blocksize_table[i] &&
204
2/2
✓ Branch 0 taken 338 times.
✓ Branch 1 taken 758 times.
1096 ff_flac_blocksize_table[i] > blocksize) {
205 338 blocksize = ff_flac_blocksize_table[i];
206 }
207 }
208 86 return blocksize;
209 }
210
211
212 86 static av_cold void dprint_compression_options(FlacEncodeContext *s)
213 {
214 86 AVCodecContext *avctx = s->avctx;
215 86 CompressionOptions *opt = &s->options;
216
217 86 av_log(avctx, AV_LOG_DEBUG, " compression: %d\n", opt->compression_level);
218
219
3/5
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 82 times.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
86 switch (opt->lpc_type) {
220 case FF_LPC_TYPE_NONE:
221 av_log(avctx, AV_LOG_DEBUG, " lpc type: None\n");
222 break;
223 3 case FF_LPC_TYPE_FIXED:
224 3 av_log(avctx, AV_LOG_DEBUG, " lpc type: Fixed pre-defined coefficients\n");
225 3 break;
226 82 case FF_LPC_TYPE_LEVINSON:
227 82 av_log(avctx, AV_LOG_DEBUG, " lpc type: Levinson-Durbin recursion with Welch window\n");
228 82 break;
229 1 case FF_LPC_TYPE_CHOLESKY:
230 1 av_log(avctx, AV_LOG_DEBUG, " lpc type: Cholesky factorization, %d pass%s\n",
231
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 opt->lpc_passes, opt->lpc_passes == 1 ? "" : "es");
232 1 break;
233 }
234
235 86 av_log(avctx, AV_LOG_DEBUG, " prediction order: %d, %d\n",
236 opt->min_prediction_order, opt->max_prediction_order);
237
238
2/7
✓ Branch 0 taken 85 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
86 switch (opt->prediction_order_method) {
239 85 case ORDER_METHOD_EST:
240 85 av_log(avctx, AV_LOG_DEBUG, " order method: %s\n", "estimate");
241 85 break;
242 case ORDER_METHOD_2LEVEL:
243 av_log(avctx, AV_LOG_DEBUG, " order method: %s\n", "2-level");
244 break;
245 1 case ORDER_METHOD_4LEVEL:
246 1 av_log(avctx, AV_LOG_DEBUG, " order method: %s\n", "4-level");
247 1 break;
248 case ORDER_METHOD_8LEVEL:
249 av_log(avctx, AV_LOG_DEBUG, " order method: %s\n", "8-level");
250 break;
251 case ORDER_METHOD_SEARCH:
252 av_log(avctx, AV_LOG_DEBUG, " order method: %s\n", "full search");
253 break;
254 case ORDER_METHOD_LOG:
255 av_log(avctx, AV_LOG_DEBUG, " order method: %s\n", "log search");
256 break;
257 }
258
259
260 86 av_log(avctx, AV_LOG_DEBUG, " partition order: %d, %d\n",
261 opt->min_partition_order, opt->max_partition_order);
262
263 86 av_log(avctx, AV_LOG_DEBUG, " block size: %d\n", avctx->frame_size);
264
265 86 av_log(avctx, AV_LOG_DEBUG, " lpc precision: %d\n",
266 opt->lpc_coeff_precision);
267 86 }
268
269
270 86 static av_cold int flac_encode_init(AVCodecContext *avctx)
271 {
272 86 int freq = avctx->sample_rate;
273 86 int channels = avctx->ch_layout.nb_channels;
274 86 FlacEncodeContext *s = avctx->priv_data;
275 int i, level, ret;
276 uint8_t *streaminfo;
277
278 86 s->avctx = avctx;
279
280
2/3
✓ Branch 0 taken 84 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
86 switch (avctx->sample_fmt) {
281 84 case AV_SAMPLE_FMT_S16:
282 84 avctx->bits_per_raw_sample = 16;
283 84 s->bps_code = 4;
284 84 break;
285 2 case AV_SAMPLE_FMT_S32:
286
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
2 if (avctx->bits_per_raw_sample <= 24) {
287
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (avctx->bits_per_raw_sample < 24)
288 av_log(avctx, AV_LOG_WARNING, "encoding as 24 bits-per-sample\n");
289 1 avctx->bits_per_raw_sample = 24;
290 1 s->bps_code = 6;
291
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 } else if (avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
292 av_log(avctx, AV_LOG_WARNING,
293 "encoding as 24 bits-per-sample, more is considered "
294 "experimental. Add -strict experimental if you want "
295 "to encode more than 24 bits-per-sample\n");
296 avctx->bits_per_raw_sample = 24;
297 s->bps_code = 6;
298 } else {
299 1 avctx->bits_per_raw_sample = 32;
300 1 s->bps_code = 7;
301 }
302 2 break;
303 }
304
305
2/4
✓ Branch 0 taken 86 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 86 times.
86 if (channels < 1 || channels > FLAC_MAX_CHANNELS) {
306 av_log(avctx, AV_LOG_ERROR, "%d channels not supported (max %d)\n",
307 channels, FLAC_MAX_CHANNELS);
308 return AVERROR(EINVAL);
309 }
310 86 s->channels = channels;
311
312 /* find samplerate in table */
313
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 86 times.
86 if (freq < 1)
314 return AVERROR(EINVAL);
315
1/2
✓ Branch 0 taken 731 times.
✗ Branch 1 not taken.
731 for (i = 1; i < 12; i++) {
316
2/2
✓ Branch 0 taken 86 times.
✓ Branch 1 taken 645 times.
731 if (freq == ff_flac_sample_rate_table[i]) {
317 86 s->samplerate = ff_flac_sample_rate_table[i];
318 86 s->sr_code[0] = i;
319 86 s->sr_code[1] = 0;
320 86 break;
321 }
322 }
323 /* if not in table, samplerate is non-standard */
324
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 86 times.
86 if (i == 12) {
325 if (freq % 1000 == 0 && freq < 255000) {
326 s->sr_code[0] = 12;
327 s->sr_code[1] = freq / 1000;
328 } else if (freq % 10 == 0 && freq < 655350) {
329 s->sr_code[0] = 14;
330 s->sr_code[1] = freq / 10;
331 } else if (freq < 65535) {
332 s->sr_code[0] = 13;
333 s->sr_code[1] = freq;
334 } else if (freq < 1048576) {
335 s->sr_code[0] = 0;
336 s->sr_code[1] = 0;
337 } else {
338 av_log(avctx, AV_LOG_ERROR, "%d Hz not supported\n", freq);
339 return AVERROR(EINVAL);
340 }
341 s->samplerate = freq;
342 }
343
344 /* set compression option defaults based on avctx->compression_level */
345
2/2
✓ Branch 0 taken 83 times.
✓ Branch 1 taken 3 times.
86 if (avctx->compression_level < 0)
346 83 s->options.compression_level = 5;
347 else
348 3 s->options.compression_level = avctx->compression_level;
349
350 86 level = s->options.compression_level;
351
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 86 times.
86 if (level > 12) {
352 av_log(avctx, AV_LOG_ERROR, "invalid compression level: %d\n",
353 s->options.compression_level);
354 return AVERROR(EINVAL);
355 }
356
357 86 s->options.block_time_ms = ((int[]){ 27, 27, 27,105,105,105,105,105,105,105,105,105,105})[level];
358
359
2/2
✓ Branch 0 taken 83 times.
✓ Branch 1 taken 3 times.
86 if (s->options.lpc_type == FF_LPC_TYPE_DEFAULT)
360 83 s->options.lpc_type = ((int[]){ FF_LPC_TYPE_FIXED, FF_LPC_TYPE_FIXED, FF_LPC_TYPE_FIXED,
361 FF_LPC_TYPE_LEVINSON, FF_LPC_TYPE_LEVINSON, FF_LPC_TYPE_LEVINSON,
362 FF_LPC_TYPE_LEVINSON, FF_LPC_TYPE_LEVINSON, FF_LPC_TYPE_LEVINSON,
363 FF_LPC_TYPE_LEVINSON, FF_LPC_TYPE_LEVINSON, FF_LPC_TYPE_LEVINSON,
364 83 FF_LPC_TYPE_LEVINSON})[level];
365
366
1/2
✓ Branch 0 taken 86 times.
✗ Branch 1 not taken.
86 if (s->options.min_prediction_order < 0)
367 86 s->options.min_prediction_order = ((int[]){ 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1})[level];
368
1/2
✓ Branch 0 taken 86 times.
✗ Branch 1 not taken.
86 if (s->options.max_prediction_order < 0)
369 86 s->options.max_prediction_order = ((int[]){ 3, 4, 4, 6, 8, 8, 8, 8, 12, 12, 12, 32, 32})[level];
370
371
1/2
✓ Branch 0 taken 86 times.
✗ Branch 1 not taken.
86 if (s->options.prediction_order_method < 0)
372 86 s->options.prediction_order_method = ((int[]){ ORDER_METHOD_EST, ORDER_METHOD_EST, ORDER_METHOD_EST,
373 ORDER_METHOD_EST, ORDER_METHOD_EST, ORDER_METHOD_EST,
374 ORDER_METHOD_4LEVEL, ORDER_METHOD_LOG, ORDER_METHOD_4LEVEL,
375 ORDER_METHOD_LOG, ORDER_METHOD_SEARCH, ORDER_METHOD_LOG,
376 86 ORDER_METHOD_SEARCH})[level];
377
378
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 86 times.
86 if (s->options.min_partition_order > s->options.max_partition_order) {
379 av_log(avctx, AV_LOG_ERROR, "invalid partition orders: min=%d max=%d\n",
380 s->options.min_partition_order, s->options.max_partition_order);
381 return AVERROR(EINVAL);
382 }
383
1/2
✓ Branch 0 taken 86 times.
✗ Branch 1 not taken.
86 if (s->options.min_partition_order < 0)
384 86 s->options.min_partition_order = ((int[]){ 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})[level];
385
1/2
✓ Branch 0 taken 86 times.
✗ Branch 1 not taken.
86 if (s->options.max_partition_order < 0)
386 86 s->options.max_partition_order = ((int[]){ 2, 2, 3, 3, 3, 8, 8, 8, 8, 8, 8, 8, 8})[level];
387
388
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 86 times.
86 if (s->options.lpc_type == FF_LPC_TYPE_NONE) {
389 s->options.min_prediction_order = 0;
390 s->options.max_prediction_order = 0;
391
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 83 times.
86 } else if (s->options.lpc_type == FF_LPC_TYPE_FIXED) {
392
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (s->options.min_prediction_order > MAX_FIXED_ORDER) {
393 av_log(avctx, AV_LOG_WARNING,
394 "invalid min prediction order %d, clamped to %d\n",
395 s->options.min_prediction_order, MAX_FIXED_ORDER);
396 s->options.min_prediction_order = MAX_FIXED_ORDER;
397 }
398
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
3 if (s->options.max_prediction_order > MAX_FIXED_ORDER) {
399 1 av_log(avctx, AV_LOG_WARNING,
400 "invalid max prediction order %d, clamped to %d\n",
401 s->options.max_prediction_order, MAX_FIXED_ORDER);
402 1 s->options.max_prediction_order = MAX_FIXED_ORDER;
403 }
404 }
405
406
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 86 times.
86 if (s->options.max_prediction_order < s->options.min_prediction_order) {
407 av_log(avctx, AV_LOG_ERROR, "invalid prediction orders: min=%d max=%d\n",
408 s->options.min_prediction_order, s->options.max_prediction_order);
409 return AVERROR(EINVAL);
410 }
411
412
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 86 times.
86 if (avctx->frame_size > 0) {
413 if (avctx->frame_size < FLAC_MIN_BLOCKSIZE ||
414 avctx->frame_size > FLAC_MAX_BLOCKSIZE) {
415 av_log(avctx, AV_LOG_ERROR, "invalid block size: %d\n",
416 avctx->frame_size);
417 return AVERROR(EINVAL);
418 }
419 } else {
420 86 s->avctx->frame_size = select_blocksize(s->samplerate, s->options.block_time_ms);
421 }
422 86 s->max_blocksize = s->avctx->frame_size;
423
424 /* set maximum encoded frame size in verbatim mode */
425 172 s->max_framesize = flac_get_max_frame_size(s->avctx->frame_size,
426 s->channels,
427 86 s->avctx->bits_per_raw_sample);
428
429 /* initialize MD5 context */
430 86 s->md5ctx = av_md5_alloc();
431
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 86 times.
86 if (!s->md5ctx)
432 return AVERROR(ENOMEM);
433 86 av_md5_init(s->md5ctx);
434
435 86 streaminfo = av_malloc(FLAC_STREAMINFO_SIZE);
436
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 86 times.
86 if (!streaminfo)
437 return AVERROR(ENOMEM);
438 86 write_streaminfo(s, streaminfo);
439 86 avctx->extradata = streaminfo;
440 86 avctx->extradata_size = FLAC_STREAMINFO_SIZE;
441
442 86 s->frame_count = 0;
443 86 s->min_framesize = s->max_framesize;
444
445
3/4
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 82 times.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
90 if ((channels == 3 &&
446
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 86 times.
90 av_channel_layout_compare(&avctx->ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_SURROUND)) ||
447 (channels == 4 &&
448 av_channel_layout_compare(&avctx->ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_2_2) &&
449
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 86 times.
86 av_channel_layout_compare(&avctx->ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_QUAD)) ||
450 (channels == 5 &&
451 av_channel_layout_compare(&avctx->ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT0) &&
452
2/2
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 79 times.
86 av_channel_layout_compare(&avctx->ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT0_BACK)) ||
453
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 1 times.
7 (channels == 6 &&
454
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
13 av_channel_layout_compare(&avctx->ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1) &&
455 6 av_channel_layout_compare(&avctx->ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1_BACK))) {
456 if (avctx->ch_layout.order != AV_CHANNEL_ORDER_UNSPEC) {
457 av_log(avctx, AV_LOG_ERROR, "Channel layout not supported by Flac, "
458 "output stream will have incorrect "
459 "channel layout.\n");
460 } else {
461 av_log(avctx, AV_LOG_WARNING, "No channel layout specified. The encoder "
462 "will use Flac channel layout for "
463 "%d channels.\n", channels);
464 }
465 }
466
467 86 ret = ff_lpc_init(&s->lpc_ctx, avctx->frame_size,
468 s->options.max_prediction_order, FF_LPC_TYPE_LEVINSON);
469
470 86 ff_bswapdsp_init(&s->bdsp);
471 86 ff_flacencdsp_init(&s->flac_dsp);
472
473 86 dprint_compression_options(s);
474
475 86 return ret;
476 }
477
478
479 5014 static void init_frame(FlacEncodeContext *s, int nb_samples)
480 {
481 int i, ch;
482 FlacFrame *frame;
483
484 5014 frame = &s->frame;
485
486
2/2
✓ Branch 0 taken 35691 times.
✓ Branch 1 taken 67 times.
35758 for (i = 0; i < 16; i++) {
487
2/2
✓ Branch 0 taken 4947 times.
✓ Branch 1 taken 30744 times.
35691 if (nb_samples == ff_flac_blocksize_table[i]) {
488 4947 frame->blocksize = ff_flac_blocksize_table[i];
489 4947 frame->bs_code[0] = i;
490 4947 frame->bs_code[1] = 0;
491 4947 break;
492 }
493 }
494
2/2
✓ Branch 0 taken 67 times.
✓ Branch 1 taken 4947 times.
5014 if (i == 16) {
495 67 frame->blocksize = nb_samples;
496
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
67 if (frame->blocksize <= 256) {
497 frame->bs_code[0] = 6;
498 frame->bs_code[1] = frame->blocksize-1;
499 } else {
500 67 frame->bs_code[0] = 7;
501 67 frame->bs_code[1] = frame->blocksize-1;
502 }
503 }
504
505
2/2
✓ Branch 0 taken 13914 times.
✓ Branch 1 taken 5014 times.
18928 for (ch = 0; ch < s->channels; ch++) {
506 13914 FlacSubframe *sub = &frame->subframes[ch];
507
508 13914 sub->wasted = 0;
509 13914 sub->obits = s->avctx->bits_per_raw_sample;
510
511
2/2
✓ Branch 0 taken 256 times.
✓ Branch 1 taken 13658 times.
13914 if (sub->obits > 16)
512 256 sub->rc.coding_mode = CODING_MODE_RICE2;
513 else
514 13658 sub->rc.coding_mode = CODING_MODE_RICE;
515 }
516
517 5014 frame->verbatim_only = 0;
518 5014 }
519
520
521 /**
522 * Copy channel-interleaved input samples into separate subframes.
523 */
524 5014 static void copy_samples(FlacEncodeContext *s, const void *samples)
525 {
526 int i, j, ch;
527 FlacFrame *frame;
528
529 #define COPY_SAMPLES(bits, shift0) do { \
530 const int ## bits ## _t *samples0 = samples; \
531 const int shift = shift0; \
532 frame = &s->frame; \
533 for (i = 0, j = 0; i < frame->blocksize; i++) \
534 for (ch = 0; ch < s->channels; ch++, j++) \
535 frame->subframes[ch].samples[i] = samples0[j] >> shift; \
536 } while (0)
537
538
2/2
✓ Branch 0 taken 4886 times.
✓ Branch 1 taken 128 times.
5014 if (s->avctx->sample_fmt == AV_SAMPLE_FMT_S16)
539
4/4
✓ Branch 0 taken 79703250 times.
✓ Branch 1 taken 27005491 times.
✓ Branch 2 taken 27005491 times.
✓ Branch 3 taken 4886 times.
106713627 COPY_SAMPLES(16, 0);
540 else
541
4/4
✓ Branch 0 taken 3928266 times.
✓ Branch 1 taken 1964133 times.
✓ Branch 2 taken 1964133 times.
✓ Branch 3 taken 128 times.
5892527 COPY_SAMPLES(32, 32 - s->avctx->bits_per_raw_sample);
542 5014 }
543
544
545 99477 static uint64_t rice_count_exact(const int32_t *res, int n, int k)
546 {
547 int i;
548 99477 uint64_t count = 0;
549
550
2/2
✓ Branch 0 taken 47175558 times.
✓ Branch 1 taken 99477 times.
47275035 for (i = 0; i < n; i++) {
551 47175558 unsigned v = ((unsigned)(res[i]) << 1) ^ (res[i] >> 31);
552 47175558 count += (v >> k) + 1 + k;
553 }
554 99477 return count;
555 }
556
557
558 13914 static uint64_t subframe_count_exact(FlacEncodeContext *s, FlacSubframe *sub,
559 int pred_order)
560 {
561 int p, porder, psize;
562 int i, part_end;
563 13914 uint64_t count = 0;
564
565 /* subframe header */
566 13914 count += 8;
567
568
2/2
✓ Branch 0 taken 5212 times.
✓ Branch 1 taken 8702 times.
13914 if (sub->wasted)
569 5212 count += sub->wasted;
570
571 /* subframe */
572
2/2
✓ Branch 0 taken 5906 times.
✓ Branch 1 taken 8008 times.
13914 if (sub->type == FLAC_SUBFRAME_CONSTANT) {
573 5906 count += sub->obits;
574
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 8007 times.
8008 } else if (sub->type == FLAC_SUBFRAME_VERBATIM) {
575 1 count += s->frame.blocksize * sub->obits;
576 } else {
577 /* warm-up samples */
578 8007 count += pred_order * sub->obits;
579
580 /* LPC coefficients */
581
2/2
✓ Branch 0 taken 7133 times.
✓ Branch 1 taken 874 times.
8007 if (sub->type == FLAC_SUBFRAME_LPC)
582 7133 count += 4 + 5 + pred_order * s->options.lpc_coeff_precision;
583
584 /* rice-encoded block */
585 8007 count += 2;
586
587 /* partition order */
588 8007 porder = sub->rc.porder;
589 8007 psize = s->frame.blocksize >> porder;
590 8007 count += 4;
591
592 /* residual */
593 8007 i = pred_order;
594 8007 part_end = psize;
595
2/2
✓ Branch 0 taken 99477 times.
✓ Branch 1 taken 8007 times.
107484 for (p = 0; p < 1 << porder; p++) {
596 99477 int k = sub->rc.params[p];
597 99477 count += sub->rc.coding_mode;
598 99477 count += rice_count_exact(&sub->residual[i], part_end - i, k);
599 99477 i = part_end;
600 99477 part_end = FFMIN(s->frame.blocksize, part_end + psize);
601 }
602 }
603
604 13914 return count;
605 }
606
607
608 #define rice_encode_count(sum, n, k) (((n)*((k)+1))+((sum-(n>>1))>>(k)))
609
610 /**
611 * Solve for d/dk(rice_encode_count) = n-((sum-(n>>1))>>(k+1)) = 0.
612 */
613 31305370 static int find_optimal_param(uint64_t sum, int n, int max_param)
614 {
615 int k;
616 uint64_t sum2;
617
618
2/2
✓ Branch 0 taken 1394733 times.
✓ Branch 1 taken 29910637 times.
31305370 if (sum <= n >> 1)
619 1394733 return 0;
620 29910637 sum2 = sum - (n >> 1);
621 29910637 k = av_log2(av_clipl_int32(sum2 / n));
622 29910637 return FFMIN(k, max_param);
623 }
624
625 27285 static int find_optimal_param_exact(uint64_t sums[32][MAX_PARTITIONS], int i, int max_param)
626 {
627 27285 int bestk = 0;
628 27285 int64_t bestbits = INT64_MAX;
629 int k;
630
631
2/2
✓ Branch 0 taken 409275 times.
✓ Branch 1 taken 27285 times.
436560 for (k = 0; k <= max_param; k++) {
632 409275 int64_t bits = sums[k][i];
633
2/2
✓ Branch 0 taken 253571 times.
✓ Branch 1 taken 155704 times.
409275 if (bits < bestbits) {
634 253571 bestbits = bits;
635 253571 bestk = k;
636 }
637 }
638
639 27285 return bestk;
640 }
641
642 669699 static uint64_t calc_optimal_rice_params(RiceContext *rc, int porder,
643 uint64_t sums[32][MAX_PARTITIONS],
644 int n, int pred_order, int max_param, int exact)
645 {
646 int i;
647 int k, cnt, part;
648 uint64_t all_bits;
649
650 669699 part = (1 << porder);
651 669699 all_bits = 4 * part;
652
653 669699 cnt = (n >> porder) - pred_order;
654
2/2
✓ Branch 0 taken 31321391 times.
✓ Branch 1 taken 669699 times.
31991090 for (i = 0; i < part; i++) {
655
2/2
✓ Branch 0 taken 27285 times.
✓ Branch 1 taken 31294106 times.
31321391 if (exact) {
656 27285 k = find_optimal_param_exact(sums, i, max_param);
657 27285 all_bits += sums[k][i];
658 } else {
659 31294106 k = find_optimal_param(sums[0][i], cnt, max_param);
660 31294106 all_bits += rice_encode_count(sums[0][i], cnt, k);
661 }
662 31321391 rc->params[i] = k;
663 31321391 cnt = n >> porder;
664 }
665
666 669699 rc->porder = porder;
667
668 669699 return all_bits;
669 }
670
671
672 91361 static void calc_sum_top(int pmax, int kmax, const uint32_t *data, int n, int pred_order,
673 uint64_t sums[32][MAX_PARTITIONS])
674 {
675 int i, k;
676 int parts;
677 const uint32_t *res, *res_end;
678
679 /* sums for highest level */
680 91361 parts = (1 << pmax);
681
682
2/2
✓ Branch 0 taken 116827 times.
✓ Branch 1 taken 91361 times.
208188 for (k = 0; k <= kmax; k++) {
683 116827 res = &data[pred_order];
684 116827 res_end = &data[n >> pmax];
685
2/2
✓ Branch 0 taken 15910104 times.
✓ Branch 1 taken 116827 times.
16026931 for (i = 0; i < parts; i++) {
686
2/2
✓ Branch 0 taken 218280 times.
✓ Branch 1 taken 15691824 times.
15910104 if (kmax) {
687 218280 uint64_t sum = (1LL + k) * (res_end - res);
688
2/2
✓ Branch 0 taken 31324725 times.
✓ Branch 1 taken 218280 times.
31543005 while (res < res_end)
689 31324725 sum += *(res++) >> k;
690 218280 sums[k][i] = sum;
691 } else {
692 15691824 uint64_t sum = 0;
693
2/2
✓ Branch 0 taken 408565508 times.
✓ Branch 1 taken 15691824 times.
424257332 while (res < res_end)
694 408565508 sum += *(res++);
695 15691824 sums[k][i] = sum;
696 }
697 15910104 res_end += n >> pmax;
698 }
699 }
700 91361 }
701
702 578338 static void calc_sum_next(int level, uint64_t sums[32][MAX_PARTITIONS], int kmax)
703 {
704 int i, k;
705 578338 int parts = (1 << level);
706
2/2
✓ Branch 0 taken 15615015 times.
✓ Branch 1 taken 578338 times.
16193353 for (i = 0; i < parts; i++) {
707
2/2
✓ Branch 0 taken 15793277 times.
✓ Branch 1 taken 15615015 times.
31408292 for (k=0; k<=kmax; k++)
708 15793277 sums[k][i] = sums[k][2*i] + sums[k][2*i+1];
709 }
710 578338 }
711
712 91361 static uint64_t calc_rice_params(RiceContext *rc,
713 uint32_t udata[FLAC_MAX_BLOCKSIZE],
714 uint64_t sums[32][MAX_PARTITIONS],
715 int pmin, int pmax,
716 const int32_t *data, int n, int pred_order, int exact)
717 {
718 int i;
719 uint64_t bits[MAX_PARTITION_ORDER+1];
720 int opt_porder;
721 RiceContext tmp_rc;
722 91361 int kmax = (1 << rc->coding_mode) - 2;
723
724 av_assert1(pmin >= 0 && pmin <= MAX_PARTITION_ORDER);
725 av_assert1(pmax >= 0 && pmax <= MAX_PARTITION_ORDER);
726 av_assert1(pmin <= pmax);
727
728 91361 tmp_rc.coding_mode = rc->coding_mode;
729
730
2/2
✓ Branch 0 taken 410653823 times.
✓ Branch 1 taken 91361 times.
410745184 for (i = pred_order; i < n; i++)
731 410653823 udata[i] = ((unsigned)(data[i]) << 1) ^ (data[i] >> 31);
732
733
2/2
✓ Branch 0 taken 1819 times.
✓ Branch 1 taken 89542 times.
91361 calc_sum_top(pmax, exact ? kmax : 0, udata, n, pred_order, sums);
734
735 91361 opt_porder = pmin;
736 91361 bits[pmin] = UINT32_MAX;
737 91361 for (i = pmax; ; ) {
738 669699 bits[i] = calc_optimal_rice_params(&tmp_rc, i, sums, n, pred_order, kmax, exact);
739
4/4
✓ Branch 0 taken 278141 times.
✓ Branch 1 taken 391558 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 278137 times.
669699 if (bits[i] < bits[opt_porder] || pmax == pmin) {
740 391562 opt_porder = i;
741 391562 *rc = tmp_rc;
742 }
743
2/2
✓ Branch 0 taken 91361 times.
✓ Branch 1 taken 578338 times.
669699 if (i == pmin)
744 91361 break;
745
2/2
✓ Branch 0 taken 5457 times.
✓ Branch 1 taken 572881 times.
578338 calc_sum_next(--i, sums, exact ? kmax : 0);
746 }
747
748 91361 return bits[opt_porder];
749 }
750
751
752 182722 static int get_max_p_order(int max_porder, int n, int order)
753 {
754 182722 int porder = FFMIN(max_porder, av_log2(n^(n-1)));
755
2/2
✓ Branch 0 taken 181142 times.
✓ Branch 1 taken 1580 times.
182722 if (order > 0)
756 181142 porder = FFMIN(porder, av_log2(n/order));
757 182722 return porder;
758 }
759
760
761 91361 static uint64_t find_subframe_rice_params(FlacEncodeContext *s,
762 FlacSubframe *sub, int pred_order)
763 {
764 91361 int pmin = get_max_p_order(s->options.min_partition_order,
765 s->frame.blocksize, pred_order);
766 91361 int pmax = get_max_p_order(s->options.max_partition_order,
767 s->frame.blocksize, pred_order);
768
769 91361 uint64_t bits = 8 + pred_order * sub->obits + 2 + sub->rc.coding_mode;
770
2/2
✓ Branch 0 taken 86809 times.
✓ Branch 1 taken 4552 times.
91361 if (sub->type == FLAC_SUBFRAME_LPC)
771 86809 bits += 4 + 5 + pred_order * s->options.lpc_coeff_precision;
772 91361 bits += calc_rice_params(&sub->rc, sub->rc_udata, sub->rc_sums, pmin, pmax, sub->residual,
773 s->frame.blocksize, pred_order, s->options.exact_rice_parameters);
774 91361 return bits;
775 }
776
777
778 4552 static void encode_residual_fixed(int32_t *res, const int32_t *smp, int n,
779 int order)
780 {
781 int i;
782
783
2/2
✓ Branch 0 taken 9292 times.
✓ Branch 1 taken 4552 times.
13844 for (i = 0; i < order; i++)
784 9292 res[i] = smp[i];
785
786
2/2
✓ Branch 0 taken 790 times.
✓ Branch 1 taken 3762 times.
4552 if (order == 0) {
787
2/2
✓ Branch 0 taken 908640 times.
✓ Branch 1 taken 790 times.
909430 for (i = order; i < n; i++)
788 908640 res[i] = smp[i];
789
2/2
✓ Branch 0 taken 932 times.
✓ Branch 1 taken 2830 times.
3762 } else if (order == 1) {
790
2/2
✓ Branch 0 taken 1899976 times.
✓ Branch 1 taken 932 times.
1900908 for (i = order; i < n; i++)
791 1899976 res[i] = smp[i] - smp[i-1];
792
2/2
✓ Branch 0 taken 1004 times.
✓ Branch 1 taken 1826 times.
2830 } else if (order == 2) {
793 1004 int a = smp[order-1] - smp[order-2];
794
2/2
✓ Branch 0 taken 1090768 times.
✓ Branch 1 taken 1004 times.
1091772 for (i = order; i < n; i += 2) {
795 1090768 int b = smp[i ] - smp[i-1];
796 1090768 res[i] = b - a;
797 1090768 a = smp[i+1] - smp[i ];
798 1090768 res[i+1] = a - b;
799 }
800
2/2
✓ Branch 0 taken 952 times.
✓ Branch 1 taken 874 times.
1826 } else if (order == 3) {
801 952 int a = smp[order-1] - smp[order-2];
802 952 int c = smp[order-1] - 2*smp[order-2] + smp[order-3];
803
2/2
✓ Branch 0 taken 874622 times.
✓ Branch 1 taken 952 times.
875574 for (i = order; i < n; i += 2) {
804 874622 int b = smp[i ] - smp[i-1];
805 874622 int d = b - a;
806 874622 res[i] = d - c;
807 874622 a = smp[i+1] - smp[i ];
808 874622 c = a - b;
809 874622 res[i+1] = c - d;
810 }
811 } else {
812 874 int a = smp[order-1] - smp[order-2];
813 874 int c = smp[order-1] - 2*smp[order-2] + smp[order-3];
814 874 int e = smp[order-1] - 3*smp[order-2] + 3*smp[order-3] - smp[order-4];
815
2/2
✓ Branch 0 taken 815074 times.
✓ Branch 1 taken 874 times.
815948 for (i = order; i < n; i += 2) {
816 815074 int b = smp[i ] - smp[i-1];
817 815074 int d = b - a;
818 815074 int f = d - c;
819 815074 res[i ] = f - e;
820 815074 a = smp[i+1] - smp[i ];
821 815074 c = a - b;
822 815074 e = c - d;
823 815074 res[i+1] = e - f;
824 }
825 }
826 4552 }
827
828
829 /* These four functions check for every residual whether it can be
830 * contained in <INT32_MIN,INT32_MAX]. In case it doesn't, the
831 * function that called this function has to try something else.
832 * Each function is duplicated, once for int32_t input, once for
833 * int64_t input */
834 #define ENCODE_RESIDUAL_FIXED_WITH_RESIDUAL_LIMIT() \
835 { \
836 for (int i = 0; i < order; i++) \
837 res[i] = smp[i]; \
838 if (order == 0) { \
839 for (int i = order; i < n; i++) { \
840 if (smp[i] == INT32_MIN) \
841 return 1; \
842 res[i] = smp[i]; \
843 } \
844 } else if (order == 1) { \
845 for (int i = order; i < n; i++) { \
846 int64_t res64 = (int64_t)smp[i] - smp[i-1]; \
847 if (res64 <= INT32_MIN || res64 > INT32_MAX) \
848 return 1; \
849 res[i] = res64; \
850 } \
851 } else if (order == 2) { \
852 for (int i = order; i < n; i++) { \
853 int64_t res64 = (int64_t)smp[i] - 2*(int64_t)smp[i-1] + smp[i-2]; \
854 if (res64 <= INT32_MIN || res64 > INT32_MAX) \
855 return 1; \
856 res[i] = res64; \
857 } \
858 } else if (order == 3) { \
859 for (int i = order; i < n; i++) { \
860 int64_t res64 = (int64_t)smp[i] - 3*(int64_t)smp[i-1] + 3*(int64_t)smp[i-2] - smp[i-3]; \
861 if (res64 <= INT32_MIN || res64 > INT32_MAX) \
862 return 1; \
863 res[i] = res64; \
864 } \
865 } else { \
866 for (int i = order; i < n; i++) { \
867 int64_t res64 = (int64_t)smp[i] - 4*(int64_t)smp[i-1] + 6*(int64_t)smp[i-2] - 4*(int64_t)smp[i-3] + smp[i-4]; \
868 if (res64 <= INT32_MIN || res64 > INT32_MAX) \
869 return 1; \
870 res[i] = res64; \
871 } \
872 } \
873 return 0; \
874 }
875
876 static int encode_residual_fixed_with_residual_limit(int32_t *res, const int32_t *smp,
877 int n, int order)
878 {
879 ENCODE_RESIDUAL_FIXED_WITH_RESIDUAL_LIMIT();
880 }
881
882
883 static int encode_residual_fixed_with_residual_limit_33bps(int32_t *res, const int64_t *smp,
884 int n, int order)
885 {
886 ENCODE_RESIDUAL_FIXED_WITH_RESIDUAL_LIMIT();
887 }
888
889 #define LPC_ENCODE_WITH_RESIDUAL_LIMIT() \
890 { \
891 for (int i = 0; i < order; i++) \
892 res[i] = smp[i]; \
893 for (int i = order; i < len; i++) { \
894 int64_t p = 0, tmp; \
895 for (int j = 0; j < order; j++) \
896 p += (int64_t)coefs[j]*smp[(i-1)-j]; \
897 p >>= shift; \
898 tmp = smp[i] - p; \
899 if (tmp <= INT32_MIN || tmp > INT32_MAX) \
900 return 1; \
901 res[i] = tmp; \
902 } \
903 return 0; \
904 }
905
906 13 static int lpc_encode_with_residual_limit(int32_t *res, const int32_t *smp, int len,
907 int order, int32_t *coefs, int shift)
908 {
909
8/10
✓ Branch 0 taken 94 times.
✓ Branch 1 taken 13 times.
✓ Branch 2 taken 401314 times.
✓ Branch 3 taken 55916 times.
✓ Branch 4 taken 55916 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 55916 times.
✓ Branch 8 taken 55916 times.
✓ Branch 9 taken 13 times.
457337 LPC_ENCODE_WITH_RESIDUAL_LIMIT();
910 }
911
912 3 static int lpc_encode_with_residual_limit_33bps(int32_t *res, const int64_t *smp, int len,
913 int order, int32_t *coefs, int shift)
914 {
915
9/10
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 73840 times.
✓ Branch 3 taken 9230 times.
✓ Branch 4 taken 9230 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 9229 times.
✓ Branch 8 taken 9230 times.
✓ Branch 9 taken 2 times.
83096 LPC_ENCODE_WITH_RESIDUAL_LIMIT();
916 }
917
918 86810 static int lpc_encode_choose_datapath(FlacEncodeContext *s, int32_t bps,
919 int32_t *res, const int32_t *smp,
920 const int64_t *smp_33bps, int len,
921 int order, int32_t *coefs, int shift)
922 {
923 86810 uint64_t max_residual_value = 0;
924 86810 int64_t max_sample_value = ((int64_t)(1) << (bps-1));
925 /* This calculates the max size of any residual with the current
926 * predictor, so we know whether we need to check the residual */
927
2/2
✓ Branch 0 taken 651109 times.
✓ Branch 1 taken 86810 times.
737919 for (int i = 0; i < order; i++)
928 651109 max_residual_value += FFABS(max_sample_value * coefs[i]);
929 86810 max_residual_value >>= shift;
930 86810 max_residual_value += max_sample_value;
931
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 86807 times.
86810 if (bps > 32) {
932
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 2 times.
3 if (lpc_encode_with_residual_limit_33bps(res, smp_33bps, len, order, coefs, shift))
933 1 return 1;
934
2/2
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 86794 times.
86807 } else if (max_residual_value > INT32_MAX) {
935
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 13 times.
13 if (lpc_encode_with_residual_limit(res, smp, len, order, coefs, shift))
936 return 1;
937
2/2
✓ Branch 0 taken 5213 times.
✓ Branch 1 taken 81581 times.
86794 } else if (bps + s->options.lpc_coeff_precision + av_log2(order) <= 32) {
938 5213 s->flac_dsp.lpc16_encode(res, smp, len, order, coefs, shift);
939 } else {
940 81581 s->flac_dsp.lpc32_encode(res, smp, len, order, coefs, shift);
941 }
942 86809 return 0;
943 }
944
945 #define DEFAULT_TO_VERBATIM() \
946 { \
947 sub->type = sub->type_code = FLAC_SUBFRAME_VERBATIM; \
948 if (sub->obits <= 32) \
949 memcpy(res, smp, n * sizeof(int32_t)); \
950 return subframe_count_exact(s, sub, 0); \
951 }
952
953 13914 static int encode_residual_ch(FlacEncodeContext *s, int ch)
954 {
955 int i, n;
956 int min_order, max_order, opt_order, omethod;
957 FlacFrame *frame;
958 FlacSubframe *sub;
959 int32_t coefs[MAX_LPC_ORDER][MAX_LPC_ORDER];
960 int shift[MAX_LPC_ORDER];
961 int32_t *res, *smp;
962 int64_t *smp_33bps;
963
964 13914 frame = &s->frame;
965 13914 sub = &frame->subframes[ch];
966 13914 res = sub->residual;
967 13914 smp = sub->samples;
968 13914 smp_33bps = frame->samples_33bps;
969 13914 n = frame->blocksize;
970
971 /* CONSTANT */
972
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 13911 times.
13914 if (sub->obits > 32) {
973
1/2
✓ Branch 0 taken 3764 times.
✗ Branch 1 not taken.
3764 for (i = 1; i < n; i++)
974
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3761 times.
3764 if(smp_33bps[i] != smp_33bps[0])
975 3 break;
976
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (i == n) {
977 sub->type = sub->type_code = FLAC_SUBFRAME_CONSTANT;
978 return subframe_count_exact(s, sub, 0);
979 }
980 } else {
981
2/2
✓ Branch 0 taken 36484243 times.
✓ Branch 1 taken 5906 times.
36490149 for (i = 1; i < n; i++)
982
2/2
✓ Branch 0 taken 8005 times.
✓ Branch 1 taken 36476238 times.
36484243 if(smp[i] != smp[0])
983 8005 break;
984
2/2
✓ Branch 0 taken 5906 times.
✓ Branch 1 taken 8005 times.
13911 if (i == n) {
985 5906 sub->type = sub->type_code = FLAC_SUBFRAME_CONSTANT;
986 5906 res[0] = smp[0];
987 5906 return subframe_count_exact(s, sub, 0);
988 }
989 }
990
991 /* VERBATIM */
992
2/4
✓ Branch 0 taken 8008 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8008 times.
8008 if (frame->verbatim_only || n < 5) {
993 DEFAULT_TO_VERBATIM();
994 }
995
996 8008 min_order = s->options.min_prediction_order;
997 8008 max_order = s->options.max_prediction_order;
998 8008 omethod = s->options.prediction_order_method;
999
1000 /* FIXED */
1001 8008 sub->type = FLAC_SUBFRAME_FIXED;
1002
1/2
✓ Branch 0 taken 8008 times.
✗ Branch 1 not taken.
8008 if (s->options.lpc_type == FF_LPC_TYPE_NONE ||
1003
3/4
✓ Branch 0 taken 7134 times.
✓ Branch 1 taken 874 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 7134 times.
8008 s->options.lpc_type == FF_LPC_TYPE_FIXED || n <= max_order) {
1004 uint64_t bits[MAX_FIXED_ORDER+1];
1005
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 874 times.
874 if (max_order > MAX_FIXED_ORDER)
1006 max_order = MAX_FIXED_ORDER;
1007 874 opt_order = 0;
1008 874 bits[0] = UINT32_MAX;
1009
2/2
✓ Branch 0 taken 4188 times.
✓ Branch 1 taken 874 times.
5062 for (i = min_order; i <= max_order; i++) {
1010
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4188 times.
4188 if (sub->obits == 33) {
1011 if (encode_residual_fixed_with_residual_limit_33bps(res, smp_33bps, n, i))
1012 continue;
1013
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4188 times.
4188 } else if (sub->obits + i >= 32) {
1014 if (encode_residual_fixed_with_residual_limit(res, smp, n, i))
1015 continue;
1016 } else
1017 4188 encode_residual_fixed(res, smp, n, i);
1018 4188 bits[i] = find_subframe_rice_params(s, sub, i);
1019
2/2
✓ Branch 0 taken 2592 times.
✓ Branch 1 taken 1596 times.
4188 if (bits[i] < bits[opt_order])
1020 2592 opt_order = i;
1021 }
1022
3/4
✓ Branch 0 taken 98 times.
✓ Branch 1 taken 776 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 98 times.
874 if (opt_order == 0 && bits[0] == UINT32_MAX) {
1023 /* No predictor found with residuals within <INT32_MIN,INT32_MAX],
1024 * so encode a verbatim subframe instead */
1025 DEFAULT_TO_VERBATIM();
1026 }
1027 874 sub->order = opt_order;
1028 874 sub->type_code = sub->type | sub->order;
1029
2/2
✓ Branch 0 taken 364 times.
✓ Branch 1 taken 510 times.
874 if (sub->order != max_order) {
1030
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 364 times.
364 if (sub->obits == 33)
1031 encode_residual_fixed_with_residual_limit_33bps(res, smp_33bps, n, sub->order);
1032
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 364 times.
364 else if (sub->obits + i >= 32)
1033 encode_residual_fixed_with_residual_limit(res, smp, n, sub->order);
1034 else
1035 364 encode_residual_fixed(res, smp, n, sub->order);
1036 364 find_subframe_rice_params(s, sub, sub->order);
1037 }
1038 874 return subframe_count_exact(s, sub, sub->order);
1039 }
1040
1041 /* LPC */
1042 7134 sub->type = FLAC_SUBFRAME_LPC;
1043
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 7131 times.
7134 if (sub->obits == 33)
1044 /* As ff_lpc_calc_coefs is shared with other codecs and the LSB
1045 * probably isn't predictable anyway, throw away LSB for analysis
1046 * so it fits 32 bit int and existing function can be used
1047 * unmodified */
1048
2/2
✓ Branch 0 taken 13824 times.
✓ Branch 1 taken 3 times.
13827 for (i = 0; i < n; i++)
1049 13824 smp[i] = smp_33bps[i] >> 1;
1050
1051 7134 opt_order = ff_lpc_calc_coefs(&s->lpc_ctx, smp, n, min_order, max_order,
1052 s->options.lpc_coeff_precision, coefs, shift, s->options.lpc_type,
1053 s->options.lpc_passes, omethod,
1054 MIN_LPC_SHIFT, MAX_LPC_SHIFT, 0);
1055
1056
3/4
✓ Branch 0 taken 7134 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6898 times.
✓ Branch 3 taken 236 times.
7134 if (omethod == ORDER_METHOD_2LEVEL ||
1057
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6898 times.
6898 omethod == ORDER_METHOD_4LEVEL ||
1058 236 omethod == ORDER_METHOD_8LEVEL) {
1059 236 int levels = 1 << omethod;
1060 uint64_t bits[1 << ORDER_METHOD_8LEVEL];
1061 236 int order = -1;
1062 236 int opt_index = levels-1;
1063 236 opt_order = max_order-1;
1064 236 bits[opt_index] = UINT32_MAX;
1065
2/2
✓ Branch 0 taken 944 times.
✓ Branch 1 taken 236 times.
1180 for (i = levels-1; i >= 0; i--) {
1066 944 int last_order = order;
1067 944 order = min_order + (((max_order-min_order+1) * (i+1)) / levels)-1;
1068 944 order = av_clip(order, min_order - 1, max_order - 1);
1069
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 944 times.
944 if (order == last_order)
1070 continue;
1071
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 944 times.
944 if(lpc_encode_choose_datapath(s, sub->obits, res, smp, smp_33bps, n, order+1, coefs[order], shift[order]))
1072 continue;
1073 944 bits[i] = find_subframe_rice_params(s, sub, order+1);
1074
2/2
✓ Branch 0 taken 58 times.
✓ Branch 1 taken 886 times.
944 if (bits[i] < bits[opt_index]) {
1075 58 opt_index = i;
1076 58 opt_order = order;
1077 }
1078 }
1079 236 opt_order++;
1080
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6898 times.
6898 } else if (omethod == ORDER_METHOD_SEARCH) {
1081 // brute-force optimal order search
1082 uint64_t bits[MAX_LPC_ORDER];
1083 opt_order = 0;
1084 bits[0] = UINT32_MAX;
1085 for (i = min_order-1; i < max_order; i++) {
1086 if(lpc_encode_choose_datapath(s, sub->obits, res, smp, smp_33bps, n, i+1, coefs[i], shift[i]))
1087 continue;
1088 bits[i] = find_subframe_rice_params(s, sub, i+1);
1089 if (bits[i] < bits[opt_order])
1090 opt_order = i;
1091 }
1092 opt_order++;
1093
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6898 times.
6898 } else if (omethod == ORDER_METHOD_LOG) {
1094 uint64_t bits[MAX_LPC_ORDER];
1095 int step;
1096
1097 opt_order = min_order - 1 + (max_order-min_order)/3;
1098 memset(bits, -1, sizeof(bits));
1099
1100 for (step = 16; step; step >>= 1) {
1101 int last = opt_order;
1102 for (i = last-step; i <= last+step; i += step) {
1103 if (i < min_order-1 || i >= max_order || bits[i] < UINT32_MAX)
1104 continue;
1105 if(lpc_encode_choose_datapath(s, sub->obits, res, smp, smp_33bps, n, i+1, coefs[i], shift[i]))
1106 continue;
1107 bits[i] = find_subframe_rice_params(s, sub, i+1);
1108 if (bits[i] < bits[opt_order])
1109 opt_order = i;
1110 }
1111 }
1112 opt_order++;
1113 }
1114
1115
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 7128 times.
7134 if (s->options.multi_dim_quant) {
1116 6 int allsteps = 1;
1117 int i, step, improved;
1118 6 int64_t best_score = INT64_MAX;
1119 int32_t qmax;
1120
1121 6 qmax = (1 << (s->options.lpc_coeff_precision - 1)) - 1;
1122
1123
2/2
✓ Branch 0 taken 47 times.
✓ Branch 1 taken 6 times.
53 for (i=0; i<opt_order; i++)
1124 47 allsteps *= 3;
1125
1126 do {
1127 14 improved = 0;
1128
2/2
✓ Branch 0 taken 78732 times.
✓ Branch 1 taken 14 times.
78746 for (step = 0; step < allsteps; step++) {
1129 78732 int tmp = step;
1130 int32_t lpc_try[MAX_LPC_ORDER];
1131 78732 int64_t score = 0;
1132 78732 int diffsum = 0;
1133
1134
2/2
✓ Branch 0 taken 623295 times.
✓ Branch 1 taken 78732 times.
702027 for (i=0; i<opt_order; i++) {
1135 623295 int diff = ((tmp + 1) % 3) - 1;
1136 623295 lpc_try[i] = av_clip(coefs[opt_order - 1][i] + diff, -qmax, qmax);
1137 623295 tmp /= 3;
1138 623295 diffsum += !!diff;
1139 }
1140
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 78732 times.
78732 if (diffsum >8)
1141 continue;
1142
1143
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 78732 times.
78732 if(lpc_encode_choose_datapath(s, sub->obits, res, smp, smp_33bps, n, opt_order, lpc_try, shift[opt_order-1]))
1144 continue;
1145 78732 score = find_subframe_rice_params(s, sub, opt_order);
1146
2/2
✓ Branch 0 taken 467 times.
✓ Branch 1 taken 78265 times.
78732 if (score < best_score) {
1147 467 best_score = score;
1148 467 memcpy(coefs[opt_order-1], lpc_try, sizeof(*coefs));
1149 467 improved=1;
1150 }
1151 }
1152
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 6 times.
14 } while(improved);
1153 }
1154
1155 7134 sub->order = opt_order;
1156 7134 sub->type_code = sub->type | (sub->order-1);
1157 7134 sub->shift = shift[sub->order-1];
1158
2/2
✓ Branch 0 taken 20026 times.
✓ Branch 1 taken 7134 times.
27160 for (i = 0; i < sub->order; i++)
1159 20026 sub->coefs[i] = coefs[sub->order-1][i];
1160
1161
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 7133 times.
7134 if(lpc_encode_choose_datapath(s, sub->obits, res, smp, smp_33bps, n, sub->order, sub->coefs, sub->shift)) {
1162 /* No predictor found with residuals within <INT32_MIN,INT32_MAX],
1163 * so encode a verbatim subframe instead */
1164
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 DEFAULT_TO_VERBATIM();
1165 }
1166
1167 7133 find_subframe_rice_params(s, sub, sub->order);
1168
1169 7133 return subframe_count_exact(s, sub, sub->order);
1170 }
1171
1172
1173 5014 static int count_frame_header(FlacEncodeContext *s)
1174 {
1175 uint8_t av_unused tmp;
1176 int count;
1177
1178 /*
1179 <14> Sync code
1180 <1> Reserved
1181 <1> Blocking strategy
1182 <4> Block size in inter-channel samples
1183 <4> Sample rate
1184 <4> Channel assignment
1185 <3> Sample size in bits
1186 <1> Reserved
1187 */
1188 5014 count = 32;
1189
1190 /* coded frame number */
1191
4/4
✓ Branch 0 taken 3658 times.
✓ Branch 1 taken 1356 times.
✓ Branch 2 taken 1356 times.
✓ Branch 3 taken 1356 times.
6370 PUT_UTF8(s->frame_count, tmp, count += 8;)
1192
1193 /* explicit block size */
1194
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5014 times.
5014 if (s->frame.bs_code[0] == 6)
1195 count += 8;
1196
2/2
✓ Branch 0 taken 67 times.
✓ Branch 1 taken 4947 times.
5014 else if (s->frame.bs_code[0] == 7)
1197 67 count += 16;
1198
1199 /* explicit sample rate */
1200
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5014 times.
5014 count += ((s->sr_code[0] == 12) + (s->sr_code[0] > 12) * 2) * 8;
1201
1202 /* frame header CRC-8 */
1203 5014 count += 8;
1204
1205 5014 return count;
1206 }
1207
1208
1209 5014 static int encode_frame(FlacEncodeContext *s)
1210 {
1211 int ch;
1212 uint64_t count;
1213
1214 5014 count = count_frame_header(s);
1215
1216
2/2
✓ Branch 0 taken 13914 times.
✓ Branch 1 taken 5014 times.
18928 for (ch = 0; ch < s->channels; ch++)
1217 13914 count += encode_residual_ch(s, ch);
1218
1219 5014 count += (8 - (count & 7)) & 7; // byte alignment
1220 5014 count += 16; // CRC-16
1221
1222 5014 count >>= 3;
1223
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5014 times.
5014 if (count > INT_MAX)
1224 return AVERROR_BUG;
1225 5014 return count;
1226 }
1227
1228
1229 5014 static void remove_wasted_bits(FlacEncodeContext *s)
1230 {
1231 int ch, i, wasted_bits;
1232
1233
2/2
✓ Branch 0 taken 8620 times.
✓ Branch 1 taken 1606 times.
10226 for (ch = 0; ch < s->channels; ch++) {
1234 8620 FlacSubframe *sub = &s->frame.subframes[ch];
1235
1236
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8612 times.
8620 if (sub->obits > 32) {
1237 8 int64_t v = 0;
1238
2/2
✓ Branch 0 taken 29481 times.
✓ Branch 1 taken 6 times.
29487 for (i = 0; i < s->frame.blocksize; i++) {
1239 29481 v |= s->frame.samples_33bps[i];
1240
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 29479 times.
29481 if (v & 1)
1241 2 break;
1242 }
1243
1244
3/4
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
8 if (!v || (v & 1))
1245 2 return;
1246
1247 6 v = ff_ctzll(v);
1248
1249 /* If any wasted bits are found, samples are moved
1250 * from frame.samples_33bps to frame.subframes[ch] */
1251
2/2
✓ Branch 0 taken 25701 times.
✓ Branch 1 taken 6 times.
25707 for (i = 0; i < s->frame.blocksize; i++)
1252 25701 sub->samples[i] = s->frame.samples_33bps[i] >> v;
1253 6 wasted_bits = v;
1254 } else {
1255 8612 int32_t v = 0;
1256
2/2
✓ Branch 0 taken 44650857 times.
✓ Branch 1 taken 6832 times.
44657689 for (i = 0; i < s->frame.blocksize; i++) {
1257 44650857 v |= sub->samples[i];
1258
2/2
✓ Branch 0 taken 1780 times.
✓ Branch 1 taken 44649077 times.
44650857 if (v & 1)
1259 1780 break;
1260 }
1261
1262
4/4
✓ Branch 0 taken 6986 times.
✓ Branch 1 taken 1626 times.
✓ Branch 2 taken 1780 times.
✓ Branch 3 taken 5206 times.
8612 if (!v || (v & 1))
1263 3406 return;
1264
1265 5206 v = ff_ctz(v);
1266
1267
2/2
✓ Branch 0 taken 34054501 times.
✓ Branch 1 taken 5206 times.
34059707 for (i = 0; i < s->frame.blocksize; i++)
1268 34054501 sub->samples[i] >>= v;
1269 5206 wasted_bits = v;
1270 }
1271
1272 5212 sub->wasted = wasted_bits;
1273 5212 sub->obits -= wasted_bits;
1274
1275 /* for 24-bit, check if removing wasted bits makes the range better
1276 * suited for using RICE instead of RICE2 for entropy coding */
1277
2/2
✓ Branch 0 taken 5200 times.
✓ Branch 1 taken 12 times.
5212 if (sub->obits <= 17)
1278 5200 sub->rc.coding_mode = CODING_MODE_RICE;
1279 }
1280 }
1281
1282
1283 2816 static int estimate_stereo_mode(const int32_t *left_ch, const int32_t *right_ch, int n,
1284 int max_rice_param, int bps)
1285 {
1286 int best;
1287 uint64_t sum[4];
1288 uint64_t score[4];
1289 int k;
1290
1291 /* calculate sum of 2nd order residual for each channel */
1292 2816 sum[0] = sum[1] = sum[2] = sum[3] = 0;
1293
2/2
✓ Branch 0 taken 2806 times.
✓ Branch 1 taken 10 times.
2816 if(bps < 30) {
1294 int32_t lt, rt;
1295
2/2
✓ Branch 0 taken 15736987 times.
✓ Branch 1 taken 2806 times.
15739793 for (int i = 2; i < n; i++) {
1296 15736987 lt = left_ch[i] - 2*left_ch[i-1] + left_ch[i-2];
1297 15736987 rt = right_ch[i] - 2*right_ch[i-1] + right_ch[i-2];
1298
2/2
✓ Branch 0 taken 12583917 times.
✓ Branch 1 taken 3153070 times.
15736987 sum[2] += FFABS((lt + rt) >> 1);
1299
2/2
✓ Branch 0 taken 13445538 times.
✓ Branch 1 taken 2291449 times.
15736987 sum[3] += FFABS(lt - rt);
1300
2/2
✓ Branch 0 taken 12590485 times.
✓ Branch 1 taken 3146502 times.
15736987 sum[0] += FFABS(lt);
1301
2/2
✓ Branch 0 taken 12590383 times.
✓ Branch 1 taken 3146604 times.
15736987 sum[1] += FFABS(rt);
1302 }
1303 } else {
1304 int64_t lt, rt;
1305
2/2
✓ Branch 0 taken 44113 times.
✓ Branch 1 taken 10 times.
44123 for (int i = 2; i < n; i++) {
1306 44113 lt = (int64_t)left_ch[i] - 2*(int64_t)left_ch[i-1] + left_ch[i-2];
1307 44113 rt = (int64_t)right_ch[i] - 2*(int64_t)right_ch[i-1] + right_ch[i-2];
1308 44113 sum[2] += FFABS((lt + rt) >> 1);
1309 44113 sum[3] += FFABS(lt - rt);
1310 44113 sum[0] += FFABS(lt);
1311 44113 sum[1] += FFABS(rt);
1312 }
1313 }
1314 /* estimate bit counts */
1315
2/2
✓ Branch 0 taken 11264 times.
✓ Branch 1 taken 2816 times.
14080 for (int i = 0; i < 4; i++) {
1316 11264 k = find_optimal_param(2 * sum[i], n, max_rice_param);
1317 11264 sum[i] = rice_encode_count( 2 * sum[i], n, k);
1318 }
1319
1320 /* calculate score for each mode */
1321 2816 score[0] = sum[0] + sum[1];
1322 2816 score[1] = sum[0] + sum[3];
1323 2816 score[2] = sum[1] + sum[3];
1324 2816 score[3] = sum[2] + sum[3];
1325
1326 /* return mode with lowest score */
1327 2816 best = 0;
1328
2/2
✓ Branch 0 taken 8448 times.
✓ Branch 1 taken 2816 times.
11264 for (int i = 1; i < 4; i++)
1329
2/2
✓ Branch 0 taken 2096 times.
✓ Branch 1 taken 6352 times.
8448 if (score[i] < score[best])
1330 2096 best = i;
1331
1332 2816 return best;
1333 }
1334
1335
1336 /**
1337 * Perform stereo channel decorrelation.
1338 */
1339 5014 static void channel_decorrelation(FlacEncodeContext *s)
1340 {
1341 FlacFrame *frame;
1342 int32_t *left, *right;
1343 int64_t *side_33bps;
1344 int n;
1345
1346 5014 frame = &s->frame;
1347 5014 n = frame->blocksize;
1348 5014 left = frame->subframes[0].samples;
1349 5014 right = frame->subframes[1].samples;
1350 5014 side_33bps = frame->samples_33bps;
1351
1352
2/2
✓ Branch 0 taken 1834 times.
✓ Branch 1 taken 3180 times.
5014 if (s->channels != 2) {
1353 1834 frame->ch_mode = FLAC_CHMODE_INDEPENDENT;
1354 1834 return;
1355 }
1356
1357
2/2
✓ Branch 0 taken 2816 times.
✓ Branch 1 taken 364 times.
3180 if (s->options.ch_mode < 0) {
1358 2816 int max_rice_param = (1 << frame->subframes[0].rc.coding_mode) - 2;
1359 2816 frame->ch_mode = estimate_stereo_mode(left, right, n, max_rice_param, s->avctx->bits_per_raw_sample);
1360 } else
1361 364 frame->ch_mode = s->options.ch_mode;
1362
1363 /* perform decorrelation and adjust bits-per-sample */
1364
2/2
✓ Branch 0 taken 1052 times.
✓ Branch 1 taken 2128 times.
3180 if (frame->ch_mode == FLAC_CHMODE_INDEPENDENT)
1365 1052 return;
1366
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 2119 times.
2128 if(s->avctx->bits_per_raw_sample == 32) {
1367
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 8 times.
9 if (frame->ch_mode == FLAC_CHMODE_MID_SIDE) {
1368 int64_t tmp;
1369
2/2
✓ Branch 0 taken 4608 times.
✓ Branch 1 taken 1 times.
4609 for (int i = 0; i < n; i++) {
1370 4608 tmp = left[i];
1371 4608 left[i] = (tmp + right[i]) >> 1;
1372 4608 side_33bps[i] = tmp - right[i];
1373 }
1374 1 frame->subframes[1].obits++;
1375
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 } else if (frame->ch_mode == FLAC_CHMODE_LEFT_SIDE) {
1376 for (int i = 0; i < n; i++)
1377 side_33bps[i] = (int64_t)left[i] - right[i];
1378 frame->subframes[1].obits++;
1379 } else {
1380
2/2
✓ Branch 0 taken 34917 times.
✓ Branch 1 taken 8 times.
34925 for (int i = 0; i < n; i++)
1381 34917 side_33bps[i] = (int64_t)left[i] - right[i];
1382 8 frame->subframes[0].obits++;
1383 }
1384 } else {
1385
2/2
✓ Branch 0 taken 254 times.
✓ Branch 1 taken 1865 times.
2119 if (frame->ch_mode == FLAC_CHMODE_MID_SIDE) {
1386 int32_t tmp;
1387
2/2
✓ Branch 0 taken 1078297 times.
✓ Branch 1 taken 254 times.
1078551 for (int i = 0; i < n; i++) {
1388 1078297 tmp = left[i];
1389 1078297 left[i] = (tmp + right[i]) >> 1;
1390 1078297 right[i] = tmp - right[i];
1391 }
1392 254 frame->subframes[1].obits++;
1393
2/2
✓ Branch 0 taken 1634 times.
✓ Branch 1 taken 231 times.
1865 } else if (frame->ch_mode == FLAC_CHMODE_LEFT_SIDE) {
1394
2/2
✓ Branch 0 taken 7968122 times.
✓ Branch 1 taken 1634 times.
7969756 for (int i = 0; i < n; i++)
1395 7968122 right[i] = left[i] - right[i];
1396 1634 frame->subframes[1].obits++;
1397 } else {
1398
2/2
✓ Branch 0 taken 787590 times.
✓ Branch 1 taken 231 times.
787821 for (int i = 0; i < n; i++)
1399 787590 left[i] -= right[i];
1400 231 frame->subframes[0].obits++;
1401 }
1402 }
1403 }
1404
1405
1406 5014 static void write_utf8(PutBitContext *pb, uint32_t val)
1407 {
1408 uint8_t tmp;
1409
4/4
✓ Branch 0 taken 3658 times.
✓ Branch 1 taken 1356 times.
✓ Branch 5 taken 1356 times.
✓ Branch 6 taken 1356 times.
6370 PUT_UTF8(val, tmp, put_bits(pb, 8, tmp);)
1410 5014 }
1411
1412
1413 5014 static void write_frame_header(FlacEncodeContext *s)
1414 {
1415 FlacFrame *frame;
1416 int crc;
1417
1418 5014 frame = &s->frame;
1419
1420 5014 put_bits(&s->pb, 16, 0xFFF8);
1421 5014 put_bits(&s->pb, 4, frame->bs_code[0]);
1422 5014 put_bits(&s->pb, 4, s->sr_code[0]);
1423
1424
2/2
✓ Branch 0 taken 2886 times.
✓ Branch 1 taken 2128 times.
5014 if (frame->ch_mode == FLAC_CHMODE_INDEPENDENT)
1425 2886 put_bits(&s->pb, 4, s->channels-1);
1426 else
1427 2128 put_bits(&s->pb, 4, frame->ch_mode + FLAC_MAX_CHANNELS - 1);
1428
1429 5014 put_bits(&s->pb, 3, s->bps_code);
1430 5014 put_bits(&s->pb, 1, 0);
1431 5014 write_utf8(&s->pb, s->frame_count);
1432
1433
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5014 times.
5014 if (frame->bs_code[0] == 6)
1434 put_bits(&s->pb, 8, frame->bs_code[1]);
1435
2/2
✓ Branch 0 taken 67 times.
✓ Branch 1 taken 4947 times.
5014 else if (frame->bs_code[0] == 7)
1436 67 put_bits(&s->pb, 16, frame->bs_code[1]);
1437
1438
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5014 times.
5014 if (s->sr_code[0] == 12)
1439 put_bits(&s->pb, 8, s->sr_code[1]);
1440
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5014 times.
5014 else if (s->sr_code[0] > 12)
1441 put_bits(&s->pb, 16, s->sr_code[1]);
1442
1443 5014 flush_put_bits(&s->pb);
1444 5014 crc = av_crc(av_crc_get_table(AV_CRC_8_ATM), 0, s->pb.buf,
1445 5014 put_bytes_output(&s->pb));
1446 5014 put_bits(&s->pb, 8, crc);
1447 5014 }
1448
1449
1450 47175558 static inline void set_sr_golomb_flac(PutBitContext *pb, int i, int k)
1451 {
1452 unsigned v, e;
1453
1454 47175558 v = ((unsigned)(i) << 1) ^ (i >> 31);
1455
1456 47175558 e = (v >> k) + 1;
1457
2/2
✓ Branch 0 taken 41 times.
✓ Branch 1 taken 47175558 times.
47175599 while (e > 31) {
1458 41 put_bits(pb, 31, 0);
1459 41 e -= 31;
1460 }
1461 47175558 put_bits(pb, e, 1);
1462
2/2
✓ Branch 0 taken 44724675 times.
✓ Branch 1 taken 2450883 times.
47175558 if (k) {
1463 44724675 unsigned mask = UINT32_MAX >> (32-k);
1464 44724675 put_bits(pb, k, v & mask);
1465 }
1466 47175558 }
1467
1468
1469 5014 static void write_subframes(FlacEncodeContext *s)
1470 {
1471 int ch;
1472
1473
2/2
✓ Branch 0 taken 13914 times.
✓ Branch 1 taken 5014 times.
18928 for (ch = 0; ch < s->channels; ch++) {
1474 13914 FlacSubframe *sub = &s->frame.subframes[ch];
1475 int p, porder, psize;
1476 int32_t *part_end;
1477 13914 int32_t *res = sub->residual;
1478 13914 int32_t *frame_end = &sub->residual[s->frame.blocksize];
1479
1480 /* subframe header */
1481 13914 put_bits(&s->pb, 1, 0);
1482 13914 put_bits(&s->pb, 6, sub->type_code);
1483 13914 put_bits(&s->pb, 1, !!sub->wasted);
1484
2/2
✓ Branch 0 taken 5212 times.
✓ Branch 1 taken 8702 times.
13914 if (sub->wasted)
1485 5212 put_bits(&s->pb, sub->wasted, 1);
1486
1487 /* subframe */
1488
2/2
✓ Branch 0 taken 5906 times.
✓ Branch 1 taken 8008 times.
13914 if (sub->type == FLAC_SUBFRAME_CONSTANT) {
1489
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5906 times.
5906 if(sub->obits == 33)
1490 put_sbits63(&s->pb, 33, s->frame.samples_33bps[0]);
1491
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5904 times.
5906 else if(sub->obits == 32)
1492 2 put_bits32(&s->pb, res[0]);
1493 else
1494 5904 put_sbits(&s->pb, sub->obits, res[0]);
1495
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 8007 times.
8008 } else if (sub->type == FLAC_SUBFRAME_VERBATIM) {
1496
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (sub->obits == 33) {
1497 1 int64_t *res64 = s->frame.samples_33bps;
1498 1 int64_t *frame_end64 = &s->frame.samples_33bps[s->frame.blocksize];
1499
2/2
✓ Branch 0 taken 4608 times.
✓ Branch 1 taken 1 times.
4609 while (res64 < frame_end64)
1500 4608 put_sbits63(&s->pb, 33, (*res64++));
1501 } else if (sub->obits == 32) {
1502 while (res < frame_end)
1503 put_bits32(&s->pb, *res++);
1504 } else {
1505 while (res < frame_end)
1506 put_sbits(&s->pb, sub->obits, *res++);
1507 }
1508 } else {
1509 /* warm-up samples */
1510
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8005 times.
8007 if (sub->obits == 33) {
1511
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 2 times.
18 for (int i = 0; i < sub->order; i++)
1512 16 put_sbits63(&s->pb, 33, s->frame.samples_33bps[i]);
1513 2 res += sub->order;
1514
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 8000 times.
8005 } else if (sub->obits == 32) {
1515
2/2
✓ Branch 0 taken 33 times.
✓ Branch 1 taken 5 times.
38 for (int i = 0; i < sub->order; i++)
1516 33 put_bits32(&s->pb, *res++);
1517 } else {
1518
2/2
✓ Branch 0 taken 22561 times.
✓ Branch 1 taken 8000 times.
30561 for (int i = 0; i < sub->order; i++)
1519 22561 put_sbits(&s->pb, sub->obits, *res++);
1520 }
1521
1522 /* LPC coefficients */
1523
2/2
✓ Branch 0 taken 7133 times.
✓ Branch 1 taken 874 times.
8007 if (sub->type == FLAC_SUBFRAME_LPC) {
1524 7133 int cbits = s->options.lpc_coeff_precision;
1525 7133 put_bits( &s->pb, 4, cbits-1);
1526 7133 put_sbits(&s->pb, 5, sub->shift);
1527
2/2
✓ Branch 0 taken 20018 times.
✓ Branch 1 taken 7133 times.
27151 for (int i = 0; i < sub->order; i++)
1528 20018 put_sbits(&s->pb, cbits, sub->coefs[i]);
1529 }
1530
1531 /* rice-encoded block */
1532 8007 put_bits(&s->pb, 2, sub->rc.coding_mode - 4);
1533
1534 /* partition order */
1535 8007 porder = sub->rc.porder;
1536 8007 psize = s->frame.blocksize >> porder;
1537 8007 put_bits(&s->pb, 4, porder);
1538
1539 /* residual */
1540 8007 part_end = &sub->residual[psize];
1541
2/2
✓ Branch 0 taken 99477 times.
✓ Branch 1 taken 8007 times.
107484 for (p = 0; p < 1 << porder; p++) {
1542 99477 int k = sub->rc.params[p];
1543 99477 put_bits(&s->pb, sub->rc.coding_mode, k);
1544
2/2
✓ Branch 0 taken 47175558 times.
✓ Branch 1 taken 99477 times.
47275035 while (res < part_end)
1545 47175558 set_sr_golomb_flac(&s->pb, *res++, k);
1546 99477 part_end = FFMIN(frame_end, part_end + psize);
1547 }
1548 }
1549 }
1550 5014 }
1551
1552
1553 5014 static void write_frame_footer(FlacEncodeContext *s)
1554 {
1555 int crc;
1556 5014 flush_put_bits(&s->pb);
1557 5014 crc = av_bswap16(av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, s->pb.buf,
1558 5014 put_bytes_output(&s->pb)));
1559 5014 put_bits(&s->pb, 16, crc);
1560 5014 flush_put_bits(&s->pb);
1561 5014 }
1562
1563
1564 5014 static int write_frame(FlacEncodeContext *s, AVPacket *avpkt)
1565 {
1566 5014 init_put_bits(&s->pb, avpkt->data, avpkt->size);
1567 5014 write_frame_header(s);
1568 5014 write_subframes(s);
1569 5014 write_frame_footer(s);
1570 5014 return put_bytes_output(&s->pb);
1571 }
1572
1573
1574 5014 static int update_md5_sum(FlacEncodeContext *s, const void *samples)
1575 {
1576 const uint8_t *buf;
1577 5014 int buf_size = s->frame.blocksize * s->channels *
1578 5014 ((s->avctx->bits_per_raw_sample + 7) / 8);
1579
1580
2/2
✓ Branch 0 taken 128 times.
✓ Branch 1 taken 4886 times.
5014 if (s->avctx->bits_per_raw_sample > 16 || HAVE_BIGENDIAN) {
1581 128 av_fast_malloc(&s->md5_buffer, &s->md5_buffer_size, buf_size);
1582
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 128 times.
128 if (!s->md5_buffer)
1583 return AVERROR(ENOMEM);
1584 }
1585
1586
2/2
✓ Branch 0 taken 4886 times.
✓ Branch 1 taken 128 times.
5014 if (s->avctx->bits_per_raw_sample <= 16) {
1587 4886 buf = (const uint8_t *)samples;
1588 #if HAVE_BIGENDIAN
1589 s->bdsp.bswap16_buf((uint16_t *) s->md5_buffer,
1590 (const uint16_t *) samples, buf_size / 2);
1591 buf = s->md5_buffer;
1592 #endif
1593
2/2
✓ Branch 0 taken 118 times.
✓ Branch 1 taken 10 times.
128 } else if (s->avctx->bits_per_raw_sample <= 24) {
1594 int i;
1595 118 const int32_t *samples0 = samples;
1596 118 uint8_t *tmp = s->md5_buffer;
1597
1598
2/2
✓ Branch 0 taken 3840000 times.
✓ Branch 1 taken 118 times.
3840118 for (i = 0; i < s->frame.blocksize * s->channels; i++) {
1599 3840000 int32_t v = samples0[i] >> 8;
1600 3840000 AV_WL24(tmp + 3*i, v);
1601 }
1602 118 buf = s->md5_buffer;
1603 } else {
1604 /* s->avctx->bits_per_raw_sample <= 32 */
1605 int i;
1606 10 const int32_t *samples0 = samples;
1607 10 uint8_t *tmp = s->md5_buffer;
1608
1609
2/2
✓ Branch 0 taken 88266 times.
✓ Branch 1 taken 10 times.
88276 for (i = 0; i < s->frame.blocksize * s->channels; i++)
1610 88266 AV_WL32(tmp + 4*i, samples0[i]);
1611 10 buf = s->md5_buffer;
1612 }
1613 5014 av_md5_update(s->md5ctx, buf, buf_size);
1614
1615 5014 return 0;
1616 }
1617
1618
1619 5154 static int flac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
1620 const AVFrame *frame, int *got_packet_ptr)
1621 {
1622 FlacEncodeContext *s;
1623 int frame_bytes, out_bytes, ret;
1624
1625 5154 s = avctx->priv_data;
1626
1627 /* when the last block is reached, update the header in extradata */
1628
2/2
✓ Branch 0 taken 140 times.
✓ Branch 1 taken 5014 times.
5154 if (!frame) {
1629 140 s->max_framesize = s->max_encoded_framesize;
1630 140 av_md5_final(s->md5ctx, s->md5sum);
1631 140 write_streaminfo(s, avctx->extradata);
1632
1633
2/2
✓ Branch 0 taken 70 times.
✓ Branch 1 taken 70 times.
140 if (!s->flushed) {
1634 70 uint8_t *side_data = av_packet_new_side_data(avpkt, AV_PKT_DATA_NEW_EXTRADATA,
1635 70 avctx->extradata_size);
1636
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 70 times.
70 if (!side_data)
1637 return AVERROR(ENOMEM);
1638 70 memcpy(side_data, avctx->extradata, avctx->extradata_size);
1639
1640 70 avpkt->pts = s->next_pts;
1641
1642 70 *got_packet_ptr = 1;
1643 70 s->flushed = 1;
1644 }
1645
1646 140 return 0;
1647 }
1648
1649 /* change max_framesize for small final frame */
1650
2/2
✓ Branch 0 taken 67 times.
✓ Branch 1 taken 4947 times.
5014 if (frame->nb_samples < s->frame.blocksize) {
1651 67 s->max_framesize = flac_get_max_frame_size(frame->nb_samples,
1652 s->channels,
1653 avctx->bits_per_raw_sample);
1654 }
1655
1656 5014 init_frame(s, frame->nb_samples);
1657
1658 5014 copy_samples(s, frame->data[0]);
1659
1660 5014 channel_decorrelation(s);
1661
1662 5014 remove_wasted_bits(s);
1663
1664 5014 frame_bytes = encode_frame(s);
1665
1666 /* Fall back on verbatim mode if the compressed frame is larger than it
1667 would be if encoded uncompressed. */
1668
2/4
✓ Branch 0 taken 5014 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 5014 times.
5014 if (frame_bytes < 0 || frame_bytes > s->max_framesize) {
1669 s->frame.verbatim_only = 1;
1670 frame_bytes = encode_frame(s);
1671 if (frame_bytes < 0) {
1672 av_log(avctx, AV_LOG_ERROR, "Bad frame count\n");
1673 return frame_bytes;
1674 }
1675 }
1676
1677
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 5014 times.
5014 if ((ret = ff_get_encode_buffer(avctx, avpkt, frame_bytes, 0)) < 0)
1678 return ret;
1679
1680 5014 out_bytes = write_frame(s, avpkt);
1681
1682 5014 s->frame_count++;
1683 5014 s->sample_count += frame->nb_samples;
1684
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 5014 times.
5014 if ((ret = update_md5_sum(s, frame->data[0])) < 0) {
1685 av_log(avctx, AV_LOG_ERROR, "Error updating MD5 checksum\n");
1686 return ret;
1687 }
1688
2/2
✓ Branch 0 taken 428 times.
✓ Branch 1 taken 4586 times.
5014 if (out_bytes > s->max_encoded_framesize)
1689 428 s->max_encoded_framesize = out_bytes;
1690
2/2
✓ Branch 0 taken 207 times.
✓ Branch 1 taken 4807 times.
5014 if (out_bytes < s->min_framesize)
1691 207 s->min_framesize = out_bytes;
1692
1693 5014 s->next_pts = frame->pts + ff_samples_to_time_base(avctx, frame->nb_samples);
1694
1695 5014 av_shrink_packet(avpkt, out_bytes);
1696
1697 5014 *got_packet_ptr = 1;
1698 5014 return 0;
1699 }
1700
1701
1702 86 static av_cold int flac_encode_close(AVCodecContext *avctx)
1703 {
1704 86 FlacEncodeContext *s = avctx->priv_data;
1705
1706 86 av_freep(&s->md5ctx);
1707 86 av_freep(&s->md5_buffer);
1708 86 ff_lpc_end(&s->lpc_ctx);
1709 86 return 0;
1710 }
1711
1712 #define FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM
1713 static const AVOption options[] = {
1714 { "lpc_coeff_precision", "LPC coefficient precision", offsetof(FlacEncodeContext, options.lpc_coeff_precision), AV_OPT_TYPE_INT, {.i64 = 15 }, 0, MAX_LPC_PRECISION, FLAGS },
1715 { "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, .unit = "lpc_type" },
1716 { "none", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_LPC_TYPE_NONE }, INT_MIN, INT_MAX, FLAGS, .unit = "lpc_type" },
1717 { "fixed", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_LPC_TYPE_FIXED }, INT_MIN, INT_MAX, FLAGS, .unit = "lpc_type" },
1718 { "levinson", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_LPC_TYPE_LEVINSON }, INT_MIN, INT_MAX, FLAGS, .unit = "lpc_type" },
1719 { "cholesky", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_LPC_TYPE_CHOLESKY }, INT_MIN, INT_MAX, FLAGS, .unit = "lpc_type" },
1720 { "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 },
1721 { "min_partition_order", NULL, offsetof(FlacEncodeContext, options.min_partition_order), AV_OPT_TYPE_INT, {.i64 = -1 }, -1, MAX_PARTITION_ORDER, FLAGS },
1722 { "max_partition_order", NULL, offsetof(FlacEncodeContext, options.max_partition_order), AV_OPT_TYPE_INT, {.i64 = -1 }, -1, MAX_PARTITION_ORDER, FLAGS },
1723 { "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, .unit = "predm" },
1724 { "estimation", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = ORDER_METHOD_EST }, INT_MIN, INT_MAX, FLAGS, .unit = "predm" },
1725 { "2level", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = ORDER_METHOD_2LEVEL }, INT_MIN, INT_MAX, FLAGS, .unit = "predm" },
1726 { "4level", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = ORDER_METHOD_4LEVEL }, INT_MIN, INT_MAX, FLAGS, .unit = "predm" },
1727 { "8level", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = ORDER_METHOD_8LEVEL }, INT_MIN, INT_MAX, FLAGS, .unit = "predm" },
1728 { "search", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = ORDER_METHOD_SEARCH }, INT_MIN, INT_MAX, FLAGS, .unit = "predm" },
1729 { "log", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = ORDER_METHOD_LOG }, INT_MIN, INT_MAX, FLAGS, .unit = "predm" },
1730 { "ch_mode", "Stereo decorrelation mode", offsetof(FlacEncodeContext, options.ch_mode), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, FLAC_CHMODE_MID_SIDE, FLAGS, .unit = "ch_mode" },
1731 { "auto", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = -1 }, INT_MIN, INT_MAX, FLAGS, .unit = "ch_mode" },
1732 { "indep", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FLAC_CHMODE_INDEPENDENT }, INT_MIN, INT_MAX, FLAGS, .unit = "ch_mode" },
1733 { "left_side", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FLAC_CHMODE_LEFT_SIDE }, INT_MIN, INT_MAX, FLAGS, .unit = "ch_mode" },
1734 { "right_side", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FLAC_CHMODE_RIGHT_SIDE }, INT_MIN, INT_MAX, FLAGS, .unit = "ch_mode" },
1735 { "mid_side", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FLAC_CHMODE_MID_SIDE }, INT_MIN, INT_MAX, FLAGS, .unit = "ch_mode" },
1736 { "exact_rice_parameters", "Calculate rice parameters exactly", offsetof(FlacEncodeContext, options.exact_rice_parameters), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
1737 { "multi_dim_quant", "Multi-dimensional quantization", offsetof(FlacEncodeContext, options.multi_dim_quant), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
1738 { "min_prediction_order", NULL, offsetof(FlacEncodeContext, options.min_prediction_order), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, MAX_LPC_ORDER, FLAGS },
1739 { "max_prediction_order", NULL, offsetof(FlacEncodeContext, options.max_prediction_order), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, MAX_LPC_ORDER, FLAGS },
1740
1741 { NULL },
1742 };
1743
1744 static const AVClass flac_encoder_class = {
1745 .class_name = "FLAC encoder",
1746 .item_name = av_default_item_name,
1747 .option = options,
1748 .version = LIBAVUTIL_VERSION_INT,
1749 };
1750
1751 const FFCodec ff_flac_encoder = {
1752 .p.name = "flac",
1753 CODEC_LONG_NAME("FLAC (Free Lossless Audio Codec)"),
1754 .p.type = AVMEDIA_TYPE_AUDIO,
1755 .p.id = AV_CODEC_ID_FLAC,
1756 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
1757 AV_CODEC_CAP_SMALL_LAST_FRAME |
1758 AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE,
1759 .priv_data_size = sizeof(FlacEncodeContext),
1760 .init = flac_encode_init,
1761 FF_CODEC_ENCODE_CB(flac_encode_frame),
1762 .close = flac_encode_close,
1763 CODEC_SAMPLEFMTS(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32),
1764 .p.priv_class = &flac_encoder_class,
1765 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_EOF_FLUSH,
1766 };
1767

抽风是什么意思 冰箱保鲜室不制冷是什么原因 凉皮什么做的 胸口出汗是什么原因 瓠子是什么
虚不受补是什么意思 女人吃什么养颜又美白 梨子什么时候成熟 吃得什么 脸发烫是什么原因
h表示什么 吹空调感冒了吃什么药 阿贝数是什么意思 什么是桥本氏甲状腺炎 反流性咽喉炎吃什么药最好
腰部凉凉的是什么原因 五一广场有什么好玩的 什么是浪漫主义 什么样的牙齿需要矫正 小别胜新婚什么意思
今是什么结构hcv8jop5ns3r.cn 黑匣子是什么luyiluode.com 欧珀莱属于什么档次gysmod.com 阴道息肉长什么样hcv9jop5ns9r.cn 腱鞘炎是什么症状hcv7jop7ns3r.cn
擅长是什么意思zsyouku.com 酩酊是什么意思hcv8jop7ns9r.cn 甲亢有什么反应hcv9jop6ns3r.cn 今年22岁属什么hcv7jop7ns3r.cn 61岁属什么生肖hcv9jop7ns0r.cn
井代表什么数字hcv9jop4ns2r.cn 半夜十二点是什么时辰hcv8jop7ns6r.cn 雅五行属性是什么hcv9jop0ns1r.cn 中国最长的河流是什么河hcv9jop4ns2r.cn 一进去就射是什么原因hcv9jop0ns2r.cn
小孩出冷汗是什么原因96micro.com 14时是什么时辰hcv8jop0ns3r.cn 什么是针灸hcv9jop4ns2r.cn 身体寒湿重吃什么好hcv7jop4ns6r.cn 慢性宫颈炎是什么意思hcv8jop7ns9r.cn
百度