1use crate::celt::bands::{
2 compute_band_energies, haar1, hysteresis_decision, normalise_bands, quant_all_bands,
3 spreading_decision, SPREAD_AGGRESSIVE, SPREAD_NONE, SPREAD_NORMAL,
4};
5
6pub mod arch_h {
7 pub type opus_val16 = f32;
8 pub type opus_val32 = f32;
9 pub type celt_sig = f32;
10 pub type celt_norm = f32;
11 pub type celt_ener = f32;
12 pub const CELT_SIG_SCALE: f32 = 32768.0f32;
13 pub const EPSILON: f32 = 1e-15f32;
14}
15#[derive(Copy, Clone)]
16#[repr(C)]
17pub struct SILKInfo {
18 pub signalType: i32,
19 pub offset: i32,
20}
21
22pub mod stddef_h {
23 pub const NULL: i32 = 0;
24}
25pub use self::arch_h::{
26 celt_ener, celt_norm, celt_sig, opus_val16, opus_val32, CELT_SIG_SCALE, EPSILON,
27};
28pub use self::stddef_h::NULL;
29use crate::celt::celt::{
30 comb_filter, init_caps, resampling_factor, spread_icdf, tapset_icdf, tf_select_table, trim_icdf,
31};
32use crate::celt::celt::{
33 CELT_GET_MODE_REQUEST, CELT_SET_ANALYSIS_REQUEST, CELT_SET_CHANNELS_REQUEST,
34 CELT_SET_END_BAND_REQUEST, CELT_SET_PREDICTION_REQUEST, CELT_SET_SIGNALLING_REQUEST,
35 CELT_SET_SILK_INFO_REQUEST, CELT_SET_START_BAND_REQUEST, COMBFILTER_MAXPERIOD,
36 COMBFILTER_MINPERIOD, OPUS_SET_ENERGY_MASK_REQUEST, OPUS_SET_LFE_REQUEST,
37};
38use crate::celt::entcode::{ec_get_error, ec_tell, ec_tell_frac, BITRES};
39use crate::celt::entenc::{
40 ec_enc, ec_enc_bit_logp, ec_enc_bits, ec_enc_done, ec_enc_icdf, ec_enc_init, ec_enc_shrink,
41 ec_enc_uint,
42};
43use crate::celt::mathops::{celt_exp2, celt_log2, celt_maxabs16, celt_sqrt};
44use crate::celt::mdct::clt_mdct_forward_c;
45use crate::celt::modes::{opus_custom_mode_create, OpusCustomMode};
46use crate::celt::pitch::{celt_inner_prod_c, pitch_downsample, pitch_search, remove_doubling};
47use crate::celt::quant_bands::{
48 amp2Log2, eMeans, quant_coarse_energy, quant_energy_finalise, quant_fine_energy,
49};
50use crate::celt::rate::clt_compute_allocation;
51use crate::externs::{memcpy, memmove, memset};
52use crate::opus_custom_encoder_ctl;
53use crate::silk::macros::EC_CLZ0;
54use crate::src::analysis::AnalysisInfo;
55use crate::src::opus_defines::{
56 OPUS_ALLOC_FAIL, OPUS_BAD_ARG, OPUS_BITRATE_MAX, OPUS_GET_FINAL_RANGE_REQUEST,
57 OPUS_GET_LSB_DEPTH_REQUEST, OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST, OPUS_INTERNAL_ERROR,
58 OPUS_OK, OPUS_RESET_STATE, OPUS_SET_BITRATE_REQUEST, OPUS_SET_COMPLEXITY_REQUEST,
59 OPUS_SET_LSB_DEPTH_REQUEST, OPUS_SET_PACKET_LOSS_PERC_REQUEST,
60 OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST, OPUS_SET_VBR_CONSTRAINT_REQUEST,
61 OPUS_SET_VBR_REQUEST, OPUS_UNIMPLEMENTED,
62};
63use crate::varargs::VarArgs;
64
65#[derive(Copy, Clone)]
66#[repr(C)]
67pub struct OpusCustomEncoder {
68 pub mode: *const OpusCustomMode,
69 pub channels: i32,
70 pub stream_channels: i32,
71 pub force_intra: i32,
72 pub clip: i32,
73 pub disable_pf: i32,
74 pub complexity: i32,
75 pub upsample: i32,
76 pub start: i32,
77 pub end: i32,
78 pub bitrate: i32,
79 pub vbr: i32,
80 pub signalling: i32,
81 pub constrained_vbr: i32,
82 pub loss_rate: i32,
83 pub lsb_depth: i32,
84 pub lfe: i32,
85 pub disable_inv: i32,
86 pub arch: i32,
87 pub rng: u32,
88 pub spread_decision: i32,
89 pub delayedIntra: opus_val32,
90 pub tonal_average: i32,
91 pub lastCodedBands: i32,
92 pub hf_average: i32,
93 pub tapset_decision: i32,
94 pub prefilter_period: i32,
95 pub prefilter_gain: opus_val16,
96 pub prefilter_tapset: i32,
97 pub consec_transient: i32,
98 pub analysis: AnalysisInfo,
99 pub silk_info: SILKInfo,
100 pub preemph_memE: [opus_val32; 2],
101 pub preemph_memD: [opus_val32; 2],
102 pub vbr_reservoir: i32,
103 pub vbr_drift: i32,
104 pub vbr_offset: i32,
105 pub vbr_count: i32,
106 pub overlap_max: opus_val32,
107 pub stereo_saving: opus_val16,
108 pub intensity: i32,
109 pub energy_mask: *mut opus_val16,
110 pub spec_avg: opus_val16,
111 pub in_mem: [celt_sig; 1],
112}
113pub unsafe fn celt_encoder_get_size(channels: i32) -> i32 {
114 let mode: *const OpusCustomMode = opus_custom_mode_create(48000, 960, NULL as *mut i32);
115 return opus_custom_encoder_get_size(mode, channels);
116}
117#[inline]
118unsafe fn opus_custom_encoder_get_size(mode: *const OpusCustomMode, channels: i32) -> i32 {
119 let size: i32 = (::core::mem::size_of::<OpusCustomEncoder>() as u64)
120 .wrapping_add(
121 ((channels * (*mode).overlap - 1) as u64)
122 .wrapping_mul(::core::mem::size_of::<celt_sig>() as u64),
123 )
124 .wrapping_add(
125 ((channels * COMBFILTER_MAXPERIOD) as u64)
126 .wrapping_mul(::core::mem::size_of::<celt_sig>() as u64),
127 )
128 .wrapping_add(
129 ((4 * channels * (*mode).nbEBands) as u64)
130 .wrapping_mul(::core::mem::size_of::<opus_val16>() as u64),
131 ) as i32;
132 return size;
133}
134unsafe fn opus_custom_encoder_init_arch(
135 st: *mut OpusCustomEncoder,
136 mode: *const OpusCustomMode,
137 channels: i32,
138 arch: i32,
139) -> i32 {
140 if channels < 0 || channels > 2 {
141 return OPUS_BAD_ARG;
142 }
143 if st.is_null() || mode.is_null() {
144 return OPUS_ALLOC_FAIL;
145 }
146 memset(
147 st as *mut i8 as *mut core::ffi::c_void,
148 0,
149 (opus_custom_encoder_get_size(mode, channels) as u64)
150 .wrapping_mul(::core::mem::size_of::<i8>() as u64),
151 );
152 (*st).mode = mode;
153 (*st).channels = channels;
154 (*st).stream_channels = (*st).channels;
155 (*st).upsample = 1;
156 (*st).start = 0;
157 (*st).end = (*(*st).mode).effEBands;
158 (*st).signalling = 1;
159 (*st).arch = arch;
160 (*st).constrained_vbr = 1;
161 (*st).clip = 1;
162 (*st).bitrate = OPUS_BITRATE_MAX;
163 (*st).vbr = 0;
164 (*st).force_intra = 0;
165 (*st).complexity = 5;
166 (*st).lsb_depth = 24;
167 opus_custom_encoder_ctl!(st, OPUS_RESET_STATE);
168 return OPUS_OK;
169}
170pub unsafe fn celt_encoder_init(
171 st: *mut OpusCustomEncoder,
172 sampling_rate: i32,
173 channels: i32,
174 arch: i32,
175) -> i32 {
176 let mut ret: i32 = 0;
177 ret = opus_custom_encoder_init_arch(
178 st,
179 opus_custom_mode_create(48000, 960, NULL as *mut i32),
180 channels,
181 arch,
182 );
183 if ret != OPUS_OK {
184 return ret;
185 }
186 (*st).upsample = resampling_factor(sampling_rate);
187 return OPUS_OK;
188}
189unsafe fn transient_analysis(
190 in_0: *const opus_val32,
191 len: i32,
192 C: i32,
193 tf_estimate: *mut opus_val16,
194 tf_chan: *mut i32,
195 allow_weak_transients: i32,
196 weak_transient: *mut i32,
197) -> i32 {
198 let mut i: i32 = 0;
199 let mut mem0: opus_val32 = 0.;
200 let mut mem1: opus_val32 = 0.;
201 let mut is_transient: i32 = 0;
202 let mut mask_metric: i32 = 0;
203 let mut c: i32 = 0;
204 let mut tf_max: opus_val16 = 0.;
205 let mut len2: i32 = 0;
206 let mut forward_decay: opus_val16 = 0.0625f32;
207 static mut inv_table: [u8; 128] = [
208 255, 255, 156, 110, 86, 70, 59, 51, 45, 40, 37, 33, 31, 28, 26, 25, 23, 22, 21, 20, 19, 18,
209 17, 16, 16, 15, 15, 14, 13, 13, 12, 12, 12, 12, 11, 11, 11, 10, 10, 10, 9, 9, 9, 9, 9, 9,
210 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5,
211 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
212 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2,
213 ];
214 let vla = len as usize;
215 let mut tmp: Vec<opus_val16> = ::std::vec::from_elem(0., vla);
216 *weak_transient = 0;
217 if allow_weak_transients != 0 {
218 forward_decay = 0.03125f32;
219 }
220 len2 = len / 2;
221 c = 0;
222 while c < C {
223 let mut mean: opus_val32 = 0.;
224 let mut unmask: i32 = 0;
225 let mut norm: opus_val32 = 0.;
226 let mut maxE: opus_val16 = 0.;
227 mem0 = 0 as opus_val32;
228 mem1 = 0 as opus_val32;
229 i = 0;
230 while i < len {
231 let mut x: opus_val32 = 0.;
232 let mut y: opus_val32 = 0.;
233 x = *in_0.offset((i + c * len) as isize);
234 y = mem0 + x;
235 mem0 = mem1 + y - 2 as f32 * x;
236 mem1 = x - 0.5f32 * y;
237 *tmp.as_mut_ptr().offset(i as isize) = y;
238 i += 1;
239 }
240 memset(
241 tmp.as_mut_ptr() as *mut core::ffi::c_void,
242 0,
243 (12_u64).wrapping_mul(::core::mem::size_of::<opus_val16>() as u64),
244 );
245 mean = 0 as opus_val32;
246 mem0 = 0 as opus_val32;
247 i = 0;
248 while i < len2 {
249 let x2: opus_val16 = *tmp.as_mut_ptr().offset((2 * i) as isize)
250 * *tmp.as_mut_ptr().offset((2 * i) as isize)
251 + *tmp.as_mut_ptr().offset((2 * i + 1) as isize)
252 * *tmp.as_mut_ptr().offset((2 * i + 1) as isize);
253 mean += x2;
254 *tmp.as_mut_ptr().offset(i as isize) = mem0 + forward_decay * (x2 - mem0);
255 mem0 = *tmp.as_mut_ptr().offset(i as isize);
256 i += 1;
257 }
258 mem0 = 0 as opus_val32;
259 maxE = 0 as opus_val16;
260 i = len2 - 1;
261 while i >= 0 {
262 *tmp.as_mut_ptr().offset(i as isize) =
263 mem0 + 0.125f32 * (*tmp.as_mut_ptr().offset(i as isize) - mem0);
264 mem0 = *tmp.as_mut_ptr().offset(i as isize);
265 maxE = if maxE > mem0 { maxE } else { mem0 };
266 i -= 1;
267 }
268 mean = celt_sqrt((mean * maxE) * 0.5f32 * len2 as f32);
269 norm = len2 as f32 / (1e-15f32 + mean);
270 unmask = 0;
271 assert!(!(*tmp.as_mut_ptr().offset(0)).is_nan());
272 assert!(!norm.is_nan());
273 i = 12;
274 while i < len2 - 5 {
275 let mut id: i32 = 0;
276 id = (if 0.0
277 > (if 127.0
278 < (64.0 * norm * (*tmp.as_mut_ptr().offset(i as isize) + 1e-15f32)).floor()
279 {
280 127.0
281 } else {
282 (64.0 * norm * (*tmp.as_mut_ptr().offset(i as isize) + 1e-15f32)).floor()
283 }) {
284 0.0
285 } else if 127.0
286 < (64.0 * norm * (*tmp.as_mut_ptr().offset(i as isize) + 1e-15f32)).floor()
287 {
288 127.0
289 } else {
290 (64.0 * norm * (*tmp.as_mut_ptr().offset(i as isize) + 1e-15f32)).floor()
291 }) as i32;
292 unmask += inv_table[id as usize] as i32;
293 i += 4;
294 }
295 unmask = 64 * unmask * 4 / (6 * (len2 - 17));
296 if unmask > mask_metric {
297 *tf_chan = c;
298 mask_metric = unmask;
299 }
300 c += 1;
301 }
302 is_transient = (mask_metric > 200) as i32;
303 if allow_weak_transients != 0 && is_transient != 0 && mask_metric < 600 {
304 is_transient = 0;
305 *weak_transient = 1;
306 }
307 tf_max = if 0 as f32 > celt_sqrt((27 * mask_metric) as f32) - 42 as f32 {
308 0 as f32
309 } else {
310 celt_sqrt((27 * mask_metric) as f32) - 42 as f32
311 };
312 *tf_estimate = (if 0 as f64
313 > (0.0069f64 as opus_val32
314 * (if (163 as f32) < tf_max {
315 163 as f32
316 } else {
317 tf_max
318 })) as f64
319 - 0.139f64
320 {
321 0 as f64
322 } else {
323 (0.0069f64 as opus_val32
324 * (if (163 as f32) < tf_max {
325 163 as f32
326 } else {
327 tf_max
328 })) as f64
329 - 0.139f64
330 })
331 .sqrt() as f32;
333 return is_transient;
334}
335unsafe fn patch_transient_decision(
336 newE: *mut opus_val16,
337 oldE: *mut opus_val16,
338 nbEBands: i32,
339 start: i32,
340 end: i32,
341 C: i32,
342) -> i32 {
343 let mut i: i32 = 0;
344 let mut c: i32 = 0;
345 let mut mean_diff: opus_val32 = 0 as opus_val32;
346 let mut spread_old: [opus_val16; 26] = [0.; 26];
347 if C == 1 {
348 spread_old[start as usize] = *oldE.offset(start as isize);
349 i = start + 1;
350 while i < end {
351 spread_old[i as usize] =
352 if spread_old[(i - 1) as usize] - 1.0f32 > *oldE.offset(i as isize) {
353 spread_old[(i - 1) as usize] - 1.0f32
354 } else {
355 *oldE.offset(i as isize)
356 };
357 i += 1;
358 }
359 } else {
360 spread_old[start as usize] =
361 if *oldE.offset(start as isize) > *oldE.offset((start + nbEBands) as isize) {
362 *oldE.offset(start as isize)
363 } else {
364 *oldE.offset((start + nbEBands) as isize)
365 };
366 i = start + 1;
367 while i < end {
368 spread_old[i as usize] = if spread_old[(i - 1) as usize] - 1.0f32
369 > (if *oldE.offset(i as isize) > *oldE.offset((i + nbEBands) as isize) {
370 *oldE.offset(i as isize)
371 } else {
372 *oldE.offset((i + nbEBands) as isize)
373 }) {
374 spread_old[(i - 1) as usize] - 1.0f32
375 } else if *oldE.offset(i as isize) > *oldE.offset((i + nbEBands) as isize) {
376 *oldE.offset(i as isize)
377 } else {
378 *oldE.offset((i + nbEBands) as isize)
379 };
380 i += 1;
381 }
382 }
383 i = end - 2;
384 while i >= start {
385 spread_old[i as usize] = if spread_old[i as usize] > spread_old[(i + 1) as usize] - 1.0f32 {
386 spread_old[i as usize]
387 } else {
388 spread_old[(i + 1) as usize] - 1.0f32
389 };
390 i -= 1;
391 }
392 c = 0;
393 loop {
394 i = if 2 > start { 2 } else { start };
395 while i < end - 1 {
396 let mut x1: opus_val16 = 0.;
397 let mut x2: opus_val16 = 0.;
398 x1 = if 0 as f32 > *newE.offset((i + c * nbEBands) as isize) {
399 0 as f32
400 } else {
401 *newE.offset((i + c * nbEBands) as isize)
402 };
403 x2 = if 0 as f32 > spread_old[i as usize] {
404 0 as f32
405 } else {
406 spread_old[i as usize]
407 };
408 mean_diff = mean_diff
409 + (if 0 as f32 > x1 - x2 {
410 0 as f32
411 } else {
412 x1 - x2
413 });
414 i += 1;
415 }
416 c += 1;
417 if !(c < C) {
418 break;
419 }
420 }
421 mean_diff = mean_diff / (C * (end - 1 - (if 2 > start { 2 } else { start }))) as opus_val32;
422 return (mean_diff > 1.0f32) as i32;
423}
424unsafe fn compute_mdcts(
425 mode: *const OpusCustomMode,
426 shortBlocks: i32,
427 in_0: *mut celt_sig,
428 out: *mut celt_sig,
429 C: i32,
430 CC: i32,
431 LM: i32,
432 upsample: i32,
433 arch: i32,
434) {
435 let overlap: i32 = (*mode).overlap;
436 let mut N: i32 = 0;
437 let mut B: i32 = 0;
438 let mut shift: i32 = 0;
439 let mut i: i32 = 0;
440 let mut b: i32 = 0;
441 let mut c: i32 = 0;
442 if shortBlocks != 0 {
443 B = shortBlocks;
444 N = (*mode).shortMdctSize;
445 shift = (*mode).maxLM;
446 } else {
447 B = 1;
448 N = (*mode).shortMdctSize << LM;
449 shift = (*mode).maxLM - LM;
450 }
451 c = 0;
452 loop {
453 b = 0;
454 while b < B {
455 clt_mdct_forward_c(
456 &(*mode).mdct,
457 in_0.offset((c * (B * N + overlap)) as isize)
458 .offset((b * N) as isize),
459 &mut *out.offset((b + c * N * B) as isize),
460 (*mode).window,
461 overlap,
462 shift,
463 B,
464 arch,
465 );
466 b += 1;
467 }
468 c += 1;
469 if !(c < CC) {
470 break;
471 }
472 }
473 if CC == 2 && C == 1 {
474 i = 0;
475 while i < B * N {
476 *out.offset(i as isize) =
477 0.5f32 * *out.offset(i as isize) + 0.5f32 * *out.offset((B * N + i) as isize);
478 i += 1;
479 }
480 }
481 if upsample != 1 {
482 c = 0;
483 loop {
484 let bound: i32 = B * N / upsample;
485 i = 0;
486 while i < bound {
487 let ref mut fresh0 = *out.offset((c * B * N + i) as isize);
488 *fresh0 *= upsample as f32;
489 i += 1;
490 }
491 memset(
492 &mut *out.offset((c * B * N + bound) as isize) as *mut celt_sig
493 as *mut core::ffi::c_void,
494 0,
495 ((B * N - bound) as u64).wrapping_mul(::core::mem::size_of::<celt_sig>() as u64),
496 );
497 c += 1;
498 if !(c < C) {
499 break;
500 }
501 }
502 }
503}
504pub unsafe fn celt_preemphasis(
505 pcmp: *const opus_val16,
506 inp: *mut celt_sig,
507 N: i32,
508 CC: i32,
509 upsample: i32,
510 coef: *const opus_val16,
511 mem: *mut celt_sig,
512 clip: i32,
513) {
514 let mut i: i32 = 0;
515 let mut coef0: opus_val16 = 0.;
516 let mut m: celt_sig = 0.;
517 let mut Nu: i32 = 0;
518 coef0 = *coef.offset(0 as isize);
519 m = *mem;
520 if *coef.offset(1 as isize) == 0 as f32 && upsample == 1 && clip == 0 {
521 i = 0;
522 while i < N {
523 let mut x: opus_val16 = 0.;
524 x = *pcmp.offset((CC * i) as isize) * CELT_SIG_SCALE;
525 *inp.offset(i as isize) = x - m;
526 m = coef0 * x;
527 i += 1;
528 }
529 *mem = m;
530 return;
531 }
532 Nu = N / upsample;
533 if upsample != 1 {
534 memset(
535 inp as *mut core::ffi::c_void,
536 0,
537 (N as u64).wrapping_mul(::core::mem::size_of::<celt_sig>() as u64),
538 );
539 }
540 i = 0;
541 while i < Nu {
542 *inp.offset((i * upsample) as isize) = *pcmp.offset((CC * i) as isize) * CELT_SIG_SCALE;
543 i += 1;
544 }
545 if clip != 0 {
546 i = 0;
547 while i < Nu {
548 *inp.offset((i * upsample) as isize) = if -65536.0f32
549 > (if 65536.0f32 < *inp.offset((i * upsample) as isize) {
550 65536.0f32
551 } else {
552 *inp.offset((i * upsample) as isize)
553 }) {
554 -65536.0f32
555 } else if 65536.0f32 < *inp.offset((i * upsample) as isize) {
556 65536.0f32
557 } else {
558 *inp.offset((i * upsample) as isize)
559 };
560 i += 1;
561 }
562 }
563 i = 0;
564 while i < N {
565 let mut x_0: opus_val16 = 0.;
566 x_0 = *inp.offset(i as isize);
567 *inp.offset(i as isize) = x_0 - m;
568 m = coef0 * x_0;
569 i += 1;
570 }
571 *mem = m;
572}
573unsafe fn l1_metric(tmp: *const celt_norm, N: i32, LM: i32, bias: opus_val16) -> opus_val32 {
574 let mut i: i32 = 0;
575 let mut L1: opus_val32 = 0.;
576 L1 = 0 as opus_val32;
577 i = 0;
578 while i < N {
579 L1 += (*tmp.offset(i as isize)).abs();
580 i += 1;
581 }
582 L1 = L1 + LM as f32 * bias * L1;
583 return L1;
584}
585unsafe fn tf_analysis(
586 m: *const OpusCustomMode,
587 len: i32,
588 isTransient: i32,
589 tf_res: *mut i32,
590 lambda: i32,
591 X: *mut celt_norm,
592 N0: i32,
593 LM: i32,
594 tf_estimate: opus_val16,
595 tf_chan: i32,
596 importance: *mut i32,
597) -> i32 {
598 let mut i: i32 = 0;
599 let mut cost0: i32 = 0;
600 let mut cost1: i32 = 0;
601 let mut sel: i32 = 0;
602 let mut selcost: [i32; 2] = [0; 2];
603 let mut tf_select: i32 = 0;
604 let mut bias: opus_val16 = 0.;
605 bias = 0.04f32
606 * (if -0.25f32 > 0.5f32 - tf_estimate {
607 -0.25f32
608 } else {
609 0.5f32 - tf_estimate
610 });
611 let vla = len as usize;
612 let mut metric: Vec<i32> = ::std::vec::from_elem(0, vla);
613 let vla_0 = ((*((*m).eBands).offset(len as isize) as i32
614 - *((*m).eBands).offset((len - 1) as isize) as i32)
615 << LM) as usize;
616 let mut tmp: Vec<celt_norm> = ::std::vec::from_elem(0., vla_0);
617 let vla_1 = ((*((*m).eBands).offset(len as isize) as i32
618 - *((*m).eBands).offset((len - 1) as isize) as i32)
619 << LM) as usize;
620 let mut tmp_1: Vec<celt_norm> = ::std::vec::from_elem(0., vla_1);
621 let vla_2 = len as usize;
622 let mut path0: Vec<i32> = ::std::vec::from_elem(0, vla_2);
623 let vla_3 = len as usize;
624 let mut path1: Vec<i32> = ::std::vec::from_elem(0, vla_3);
625 i = 0;
626 while i < len {
627 let mut k: i32 = 0;
628 let mut N: i32 = 0;
629 let mut narrow: i32 = 0;
630 let mut L1: opus_val32 = 0.;
631 let mut best_L1: opus_val32 = 0.;
632 let mut best_level: i32 = 0;
633 N = (*((*m).eBands).offset((i + 1) as isize) as i32
634 - *((*m).eBands).offset(i as isize) as i32)
635 << LM;
636 narrow = (*((*m).eBands).offset((i + 1) as isize) as i32
637 - *((*m).eBands).offset(i as isize) as i32
638 == 1) as i32;
639 memcpy(
640 tmp.as_mut_ptr() as *mut core::ffi::c_void,
641 &mut *X.offset(
642 (tf_chan * N0 + ((*((*m).eBands).offset(i as isize) as i32) << LM)) as isize,
643 ) as *mut celt_norm as *const core::ffi::c_void,
644 (N as u64)
645 .wrapping_mul(::core::mem::size_of::<celt_norm>() as u64)
646 .wrapping_add(
647 (0 * tmp.as_mut_ptr().offset_from(&mut *X.offset(
648 (tf_chan * N0 + ((*((*m).eBands).offset(i as isize) as i32) << LM))
649 as isize,
650 )) as i64) as u64,
651 ),
652 );
653 L1 = l1_metric(
654 tmp.as_mut_ptr(),
655 N,
656 if isTransient != 0 { LM } else { 0 },
657 bias,
658 );
659 best_L1 = L1;
660 if isTransient != 0 && narrow == 0 {
661 memcpy(
662 tmp_1.as_mut_ptr() as *mut core::ffi::c_void,
663 tmp.as_mut_ptr() as *const core::ffi::c_void,
664 (N as u64)
665 .wrapping_mul(::core::mem::size_of::<celt_norm>() as u64)
666 .wrapping_add(
667 (0 * tmp_1.as_mut_ptr().offset_from(tmp.as_mut_ptr()) as i64) as u64,
668 ),
669 );
670 haar1(tmp_1.as_mut_ptr(), N >> LM, (1) << LM);
671 L1 = l1_metric(tmp_1.as_mut_ptr(), N, LM + 1, bias);
672 if L1 < best_L1 {
673 best_L1 = L1;
674 best_level = -1;
675 }
676 }
677 k = 0;
678 while k < LM + !(isTransient != 0 || narrow != 0) as i32 {
679 let mut B: i32 = 0;
680 if isTransient != 0 {
681 B = LM - k - 1;
682 } else {
683 B = k + 1;
684 }
685 haar1(tmp.as_mut_ptr(), N >> k, (1) << k);
686 L1 = l1_metric(tmp.as_mut_ptr(), N, B, bias);
687 if L1 < best_L1 {
688 best_L1 = L1;
689 best_level = k + 1;
690 }
691 k += 1;
692 }
693 if isTransient != 0 {
694 *metric.as_mut_ptr().offset(i as isize) = 2 * best_level;
695 } else {
696 *metric.as_mut_ptr().offset(i as isize) = -(2) * best_level;
697 }
698 if narrow != 0
699 && (*metric.as_mut_ptr().offset(i as isize) == 0
700 || *metric.as_mut_ptr().offset(i as isize) == -(2) * LM)
701 {
702 *metric.as_mut_ptr().offset(i as isize) -= 1;
703 }
704 i += 1;
705 }
706 tf_select = 0;
707 sel = 0;
708 while sel < 2 {
709 cost0 = *importance.offset(0 as isize)
710 * (*metric.as_mut_ptr().offset(0 as isize)
711 - 2 * tf_select_table[LM as usize][(4 * isTransient + 2 * sel + 0) as usize]
712 as i32)
713 .abs();
714 cost1 = *importance.offset(0 as isize)
715 * (*metric.as_mut_ptr().offset(0 as isize)
716 - 2 * tf_select_table[LM as usize][(4 * isTransient + 2 * sel + 1) as usize]
717 as i32)
718 .abs()
719 + (if isTransient != 0 { 0 } else { lambda });
720 i = 1;
721 while i < len {
722 let mut curr0: i32 = 0;
723 let mut curr1: i32 = 0;
724 curr0 = if cost0 < cost1 + lambda {
725 cost0
726 } else {
727 cost1 + lambda
728 };
729 curr1 = if cost0 + lambda < cost1 {
730 cost0 + lambda
731 } else {
732 cost1
733 };
734 cost0 = curr0
735 + *importance.offset(i as isize)
736 * (*metric.as_mut_ptr().offset(i as isize)
737 - 2 * tf_select_table[LM as usize][(4 * isTransient + 2 * sel + 0) as usize]
738 as i32)
739 .abs();
740 cost1 = curr1
741 + *importance.offset(i as isize)
742 * (*metric.as_mut_ptr().offset(i as isize)
743 - 2 * tf_select_table[LM as usize][(4 * isTransient + 2 * sel + 1) as usize]
744 as i32)
745 .abs();
746 i += 1;
747 }
748 cost0 = if cost0 < cost1 { cost0 } else { cost1 };
749 selcost[sel as usize] = cost0;
750 sel += 1;
751 }
752 if selcost[1 as usize] < selcost[0 as usize] && isTransient != 0 {
753 tf_select = 1;
754 }
755 cost0 = *importance.offset(0 as isize)
756 * (*metric.as_mut_ptr().offset(0 as isize)
757 - 2 * tf_select_table[LM as usize][(4 * isTransient + 2 * tf_select + 0) as usize]
758 as i32)
759 .abs();
760 cost1 = *importance.offset(0 as isize)
761 * (*metric.as_mut_ptr().offset(0 as isize)
762 - 2 * tf_select_table[LM as usize][(4 * isTransient + 2 * tf_select + 1) as usize]
763 as i32)
764 .abs()
765 + (if isTransient != 0 { 0 } else { lambda });
766 i = 1;
767 while i < len {
768 let mut curr0_0: i32 = 0;
769 let mut curr1_0: i32 = 0;
770 let mut from0: i32 = 0;
771 let mut from1: i32 = 0;
772 from0 = cost0;
773 from1 = cost1 + lambda;
774 if from0 < from1 {
775 curr0_0 = from0;
776 *path0.as_mut_ptr().offset(i as isize) = 0;
777 } else {
778 curr0_0 = from1;
779 *path0.as_mut_ptr().offset(i as isize) = 1;
780 }
781 from0 = cost0 + lambda;
782 from1 = cost1;
783 if from0 < from1 {
784 curr1_0 = from0;
785 *path1.as_mut_ptr().offset(i as isize) = 0;
786 } else {
787 curr1_0 = from1;
788 *path1.as_mut_ptr().offset(i as isize) = 1;
789 }
790 cost0 = curr0_0
791 + *importance.offset(i as isize)
792 * (*metric.as_mut_ptr().offset(i as isize)
793 - 2 * tf_select_table[LM as usize]
794 [(4 * isTransient + 2 * tf_select + 0) as usize]
795 as i32)
796 .abs();
797 cost1 = curr1_0
798 + *importance.offset(i as isize)
799 * (*metric.as_mut_ptr().offset(i as isize)
800 - 2 * tf_select_table[LM as usize]
801 [(4 * isTransient + 2 * tf_select + 1) as usize]
802 as i32)
803 .abs();
804 i += 1;
805 }
806 *tf_res.offset((len - 1) as isize) = if cost0 < cost1 { 0 } else { 1 };
807 i = len - 2;
808 while i >= 0 {
809 if *tf_res.offset((i + 1) as isize) == 1 {
810 *tf_res.offset(i as isize) = *path1.as_mut_ptr().offset((i + 1) as isize);
811 } else {
812 *tf_res.offset(i as isize) = *path0.as_mut_ptr().offset((i + 1) as isize);
813 }
814 i -= 1;
815 }
816 return tf_select;
817}
818unsafe fn tf_encode(
819 start: i32,
820 end: i32,
821 isTransient: i32,
822 tf_res: *mut i32,
823 LM: i32,
824 mut tf_select: i32,
825 enc: &mut ec_enc,
826) {
827 let mut curr: i32 = 0;
828 let mut i: i32 = 0;
829 let mut tf_select_rsv: i32 = 0;
830 let mut tf_changed: i32 = 0;
831 let mut logp: i32 = 0;
832 let mut budget: u32 = 0;
833 let mut tell: u32 = 0;
834 budget = ((*enc).storage).wrapping_mul(8);
835 tell = ec_tell(enc) as u32;
836 logp = if isTransient != 0 { 2 } else { 4 };
837 tf_select_rsv = (LM > 0 && tell.wrapping_add(logp as u32).wrapping_add(1) <= budget) as i32;
838 budget = (budget as u32).wrapping_sub(tf_select_rsv as u32) as u32 as u32;
839 tf_changed = 0;
840 curr = tf_changed;
841 i = start;
842 while i < end {
843 if tell.wrapping_add(logp as u32) <= budget {
844 ec_enc_bit_logp(enc, *tf_res.offset(i as isize) ^ curr, logp as u32);
845 tell = ec_tell(enc) as u32;
846 curr = *tf_res.offset(i as isize);
847 tf_changed |= curr;
848 } else {
849 *tf_res.offset(i as isize) = curr;
850 }
851 logp = if isTransient != 0 { 4 } else { 5 };
852 i += 1;
853 }
854 if tf_select_rsv != 0
855 && tf_select_table[LM as usize][(4 * isTransient + 0 + tf_changed) as usize] as i32
856 != tf_select_table[LM as usize][(4 * isTransient + 2 + tf_changed) as usize] as i32
857 {
858 ec_enc_bit_logp(enc, tf_select, 1);
859 } else {
860 tf_select = 0;
861 }
862 i = start;
863 while i < end {
864 *tf_res.offset(i as isize) = tf_select_table[LM as usize]
865 [(4 * isTransient + 2 * tf_select + *tf_res.offset(i as isize)) as usize]
866 as i32;
867 i += 1;
868 }
869}
870unsafe fn alloc_trim_analysis(
871 m: *const OpusCustomMode,
872 X: *const celt_norm,
873 bandLogE: *const opus_val16,
874 end: i32,
875 LM: i32,
876 C: i32,
877 N0: i32,
878 analysis: *mut AnalysisInfo,
879 stereo_saving: *mut opus_val16,
880 tf_estimate: opus_val16,
881 intensity: i32,
882 surround_trim: opus_val16,
883 equiv_rate: i32,
884 _arch: i32,
885) -> i32 {
886 let mut i: i32 = 0;
887 let mut diff: opus_val32 = 0 as opus_val32;
888 let mut c: i32 = 0;
889 let mut trim_index: i32 = 0;
890 let mut trim: opus_val16 = 5.0f32;
891 let mut logXC: opus_val16 = 0.;
892 let mut logXC2: opus_val16 = 0.;
893 if equiv_rate < 64000 {
894 trim = 4.0f32;
895 } else if equiv_rate < 80000 {
896 let frac: i32 = equiv_rate - 64000 >> 10;
897 trim = 4.0f32 + 1.0f32 / 16.0f32 * frac as f32;
898 }
899 if C == 2 {
900 let mut sum: opus_val16 = 0 as opus_val16;
901 let mut minXC: opus_val16 = 0.;
902 i = 0;
903 while i < 8 {
904 let mut partial: opus_val32 = 0.;
905 partial = celt_inner_prod_c(
906 &*X.offset(((*((*m).eBands).offset(i as isize) as i32) << LM) as isize),
907 &*X.offset((N0 + ((*((*m).eBands).offset(i as isize) as i32) << LM)) as isize),
908 (*((*m).eBands).offset((i + 1) as isize) as i32
909 - *((*m).eBands).offset(i as isize) as i32)
910 << LM,
911 );
912 sum = sum + partial;
913 i += 1;
914 }
915 sum = 1.0f32 / 8 as f32 * sum;
916 sum = if 1.0f32 < (sum).abs() {
917 1.0f32
918 } else {
919 (sum).abs()
920 };
921 minXC = sum;
922 i = 8;
923 while i < intensity {
924 let mut partial_0: opus_val32 = 0.;
925 partial_0 = celt_inner_prod_c(
926 &*X.offset(((*((*m).eBands).offset(i as isize) as i32) << LM) as isize),
927 &*X.offset((N0 + ((*((*m).eBands).offset(i as isize) as i32) << LM)) as isize),
928 (*((*m).eBands).offset((i + 1) as isize) as i32
929 - *((*m).eBands).offset(i as isize) as i32)
930 << LM,
931 );
932 minXC = if minXC < (partial_0).abs() {
933 minXC
934 } else {
935 (partial_0).abs()
936 };
937 i += 1;
938 }
939 minXC = if 1.0f32 < (minXC).abs() {
940 1.0f32
941 } else {
942 (minXC).abs()
943 };
944 logXC = celt_log2(1.001f32 - sum * sum);
945 logXC2 = if 0.5f32 * logXC > celt_log2(1.001f32 - minXC * minXC) {
946 0.5f32 * logXC
947 } else {
948 celt_log2(1.001f32 - minXC * minXC)
949 };
950 trim += if -4.0f32 > 0.75f32 * logXC {
951 -4.0f32
952 } else {
953 0.75f32 * logXC
954 };
955 *stereo_saving = if *stereo_saving + 0.25f32 < -(0.5f32 * logXC2) {
956 *stereo_saving + 0.25f32
957 } else {
958 -(0.5f32 * logXC2)
959 };
960 }
961 c = 0;
962 loop {
963 i = 0;
964 while i < end - 1 {
965 diff += *bandLogE.offset((i + c * (*m).nbEBands) as isize) * (2 + 2 * i - end) as f32;
966 i += 1;
967 }
968 c += 1;
969 if !(c < C) {
970 break;
971 }
972 }
973 diff /= (C * (end - 1)) as f32;
974 trim -= if -2.0f32
975 > (if 2.0f32 < (diff + 1.0f32) / 6 as f32 {
976 2.0f32
977 } else {
978 (diff + 1.0f32) / 6 as f32
979 }) {
980 -2.0f32
981 } else if 2.0f32 < (diff + 1.0f32) / 6 as f32 {
982 2.0f32
983 } else {
984 (diff + 1.0f32) / 6 as f32
985 };
986 trim -= surround_trim;
987 trim -= 2 as f32 * tf_estimate;
988 if (*analysis).valid != 0 {
989 trim -= if -2.0f32
990 > (if 2.0f32 < 2.0f32 * ((*analysis).tonality_slope + 0.05f32) {
991 2.0f32
992 } else {
993 2.0f32 * ((*analysis).tonality_slope + 0.05f32)
994 }) {
995 -2.0f32
996 } else if 2.0f32 < 2.0f32 * ((*analysis).tonality_slope + 0.05f32) {
997 2.0f32
998 } else {
999 2.0f32 * ((*analysis).tonality_slope + 0.05f32)
1000 };
1001 }
1002 trim_index = (0.5f32 + trim).floor() as i32;
1003 trim_index = if 0 > (if (10) < trim_index { 10 } else { trim_index }) {
1004 0
1005 } else if (10) < trim_index {
1006 10
1007 } else {
1008 trim_index
1009 };
1010 return trim_index;
1011}
1012unsafe fn stereo_analysis(m: *const OpusCustomMode, X: *const celt_norm, LM: i32, N0: i32) -> i32 {
1013 let mut i: i32 = 0;
1014 let mut thetas: i32 = 0;
1015 let mut sumLR: opus_val32 = EPSILON;
1016 let mut sumMS: opus_val32 = EPSILON;
1017 i = 0;
1018 while i < 13 {
1019 let mut j: i32 = 0;
1020 j = (*((*m).eBands).offset(i as isize) as i32) << LM;
1021 while j < (*((*m).eBands).offset((i + 1) as isize) as i32) << LM {
1022 let mut L: opus_val32 = 0.;
1023 let mut R: opus_val32 = 0.;
1024 let mut M: opus_val32 = 0.;
1025 let mut S: opus_val32 = 0.;
1026 L = *X.offset(j as isize);
1027 R = *X.offset((N0 + j) as isize);
1028 M = L + R;
1029 S = L - R;
1030 sumLR = sumLR + ((L).abs() + (R).abs());
1031 sumMS = sumMS + ((M).abs() + (S).abs());
1032 j += 1;
1033 }
1034 i += 1;
1035 }
1036 sumMS = 0.707107f32 * sumMS;
1037 thetas = 13;
1038 if LM <= 1 {
1039 thetas -= 8;
1040 }
1041 return ((((*((*m).eBands).offset(13 as isize) as i32) << LM + 1) + thetas) as f32 * sumMS
1042 > ((*((*m).eBands).offset(13 as isize) as i32) << LM + 1) as f32 * sumLR)
1043 as i32;
1044}
1045unsafe fn median_of_5(x: *const opus_val16) -> opus_val16 {
1046 let mut t0: opus_val16 = 0.;
1047 let mut t1: opus_val16 = 0.;
1048 let mut t2: opus_val16 = 0.;
1049 let mut t3: opus_val16 = 0.;
1050 let mut t4: opus_val16 = 0.;
1051 t2 = *x.offset(2 as isize);
1052 if *x.offset(0 as isize) > *x.offset(1 as isize) {
1053 t0 = *x.offset(1 as isize);
1054 t1 = *x.offset(0 as isize);
1055 } else {
1056 t0 = *x.offset(0 as isize);
1057 t1 = *x.offset(1 as isize);
1058 }
1059 if *x.offset(3 as isize) > *x.offset(4 as isize) {
1060 t3 = *x.offset(4 as isize);
1061 t4 = *x.offset(3 as isize);
1062 } else {
1063 t3 = *x.offset(3 as isize);
1064 t4 = *x.offset(4 as isize);
1065 }
1066 if t0 > t3 {
1067 let tmp: opus_val16 = t0;
1068 t0 = t3;
1069 t3 = tmp;
1070 let tmp_0: opus_val16 = t1;
1071 t1 = t4;
1072 t4 = tmp_0;
1073 }
1074 if t2 > t1 {
1075 if t1 < t3 {
1076 return if t2 < t3 { t2 } else { t3 };
1077 } else {
1078 return if t4 < t1 { t4 } else { t1 };
1079 }
1080 } else if t2 < t3 {
1081 return if t1 < t3 { t1 } else { t3 };
1082 } else {
1083 return if t2 < t4 { t2 } else { t4 };
1084 };
1085}
1086unsafe fn median_of_3(x: *const opus_val16) -> opus_val16 {
1087 let mut t0: opus_val16 = 0.;
1088 let mut t1: opus_val16 = 0.;
1089 let mut t2: opus_val16 = 0.;
1090 if *x.offset(0 as isize) > *x.offset(1 as isize) {
1091 t0 = *x.offset(1 as isize);
1092 t1 = *x.offset(0 as isize);
1093 } else {
1094 t0 = *x.offset(0 as isize);
1095 t1 = *x.offset(1 as isize);
1096 }
1097 t2 = *x.offset(2 as isize);
1098 if t1 < t2 {
1099 return t1;
1100 } else if t0 < t2 {
1101 return t2;
1102 } else {
1103 return t0;
1104 };
1105}
1106unsafe fn dynalloc_analysis(
1107 bandLogE: *const opus_val16,
1108 bandLogE2: *const opus_val16,
1109 nbEBands: i32,
1110 start: i32,
1111 end: i32,
1112 C: i32,
1113 offsets: *mut i32,
1114 lsb_depth: i32,
1115 logN: *const i16,
1116 isTransient: i32,
1117 vbr: i32,
1118 constrained_vbr: i32,
1119 eBands: *const i16,
1120 LM: i32,
1121 effectiveBytes: i32,
1122 tot_boost_: *mut i32,
1123 lfe: i32,
1124 surround_dynalloc: *mut opus_val16,
1125 analysis: *mut AnalysisInfo,
1126 importance: *mut i32,
1127 spread_weight: *mut i32,
1128) -> opus_val16 {
1129 let mut i: i32 = 0;
1130 let mut c: i32 = 0;
1131 let mut tot_boost: i32 = 0;
1132 let mut maxDepth: opus_val16 = 0.;
1133 let vla = (C * nbEBands) as usize;
1134 let mut follower: Vec<opus_val16> = ::std::vec::from_elem(0., vla);
1135 let vla_0 = (C * nbEBands) as usize;
1136 let mut noise_floor: Vec<opus_val16> = ::std::vec::from_elem(0., vla_0);
1137 memset(
1138 offsets as *mut core::ffi::c_void,
1139 0,
1140 (nbEBands as u64).wrapping_mul(::core::mem::size_of::<i32>() as u64),
1141 );
1142 maxDepth = -31.9f32;
1143 i = 0;
1144 while i < end {
1145 *noise_floor.as_mut_ptr().offset(i as isize) =
1146 0.0625f32 * *logN.offset(i as isize) as opus_val32 + 0.5f32 + (9 - lsb_depth) as f32
1147 - eMeans[i as usize]
1148 + 0.0062f64 as opus_val32 * ((i + 5) * (i + 5)) as opus_val32;
1149 i += 1;
1150 }
1151 c = 0;
1152 loop {
1153 i = 0;
1154 while i < end {
1155 maxDepth = if maxDepth
1156 > *bandLogE.offset((c * nbEBands + i) as isize)
1157 - *noise_floor.as_mut_ptr().offset(i as isize)
1158 {
1159 maxDepth
1160 } else {
1161 *bandLogE.offset((c * nbEBands + i) as isize)
1162 - *noise_floor.as_mut_ptr().offset(i as isize)
1163 };
1164 i += 1;
1165 }
1166 c += 1;
1167 if !(c < C) {
1168 break;
1169 }
1170 }
1171 let vla_1 = nbEBands as usize;
1172 let mut mask: Vec<opus_val16> = ::std::vec::from_elem(0., vla_1);
1173 let vla_2 = nbEBands as usize;
1174 let mut sig: Vec<opus_val16> = ::std::vec::from_elem(0., vla_2);
1175 i = 0;
1176 while i < end {
1177 *mask.as_mut_ptr().offset(i as isize) =
1178 *bandLogE.offset(i as isize) - *noise_floor.as_mut_ptr().offset(i as isize);
1179 i += 1;
1180 }
1181 if C == 2 {
1182 i = 0;
1183 while i < end {
1184 *mask.as_mut_ptr().offset(i as isize) = if *mask.as_mut_ptr().offset(i as isize)
1185 > *bandLogE.offset((nbEBands + i) as isize)
1186 - *noise_floor.as_mut_ptr().offset(i as isize)
1187 {
1188 *mask.as_mut_ptr().offset(i as isize)
1189 } else {
1190 *bandLogE.offset((nbEBands + i) as isize)
1191 - *noise_floor.as_mut_ptr().offset(i as isize)
1192 };
1193 i += 1;
1194 }
1195 }
1196 memcpy(
1197 sig.as_mut_ptr() as *mut core::ffi::c_void,
1198 mask.as_mut_ptr() as *const core::ffi::c_void,
1199 (end as u64)
1200 .wrapping_mul(::core::mem::size_of::<opus_val16>() as u64)
1201 .wrapping_add((0 * sig.as_mut_ptr().offset_from(mask.as_mut_ptr()) as i64) as u64),
1202 );
1203 i = 1;
1204 while i < end {
1205 *mask.as_mut_ptr().offset(i as isize) = if *mask.as_mut_ptr().offset(i as isize)
1206 > *mask.as_mut_ptr().offset((i - 1) as isize) - 2.0f32
1207 {
1208 *mask.as_mut_ptr().offset(i as isize)
1209 } else {
1210 *mask.as_mut_ptr().offset((i - 1) as isize) - 2.0f32
1211 };
1212 i += 1;
1213 }
1214 i = end - 2;
1215 while i >= 0 {
1216 *mask.as_mut_ptr().offset(i as isize) = if *mask.as_mut_ptr().offset(i as isize)
1217 > *mask.as_mut_ptr().offset((i + 1) as isize) - 3.0f32
1218 {
1219 *mask.as_mut_ptr().offset(i as isize)
1220 } else {
1221 *mask.as_mut_ptr().offset((i + 1) as isize) - 3.0f32
1222 };
1223 i -= 1;
1224 }
1225 i = 0;
1226 while i < end {
1227 let smr: opus_val16 = *sig.as_mut_ptr().offset(i as isize)
1228 - (if (if 0 as f32 > maxDepth - 12.0f32 {
1229 0 as f32
1230 } else {
1231 maxDepth - 12.0f32
1232 }) > *mask.as_mut_ptr().offset(i as isize)
1233 {
1234 if 0 as f32 > maxDepth - 12.0f32 {
1235 0 as f32
1236 } else {
1237 maxDepth - 12.0f32
1238 }
1239 } else {
1240 *mask.as_mut_ptr().offset(i as isize)
1241 });
1242 let shift: i32 = if (5)
1243 < (if 0 > -((0.5f32 + smr).floor() as i32) {
1244 0
1245 } else {
1246 -((0.5f32 + smr).floor() as i32)
1247 }) {
1248 5
1249 } else if 0 > -((0.5f32 + smr).floor() as i32) {
1250 0
1251 } else {
1252 -((0.5f32 + smr).floor() as i32)
1253 };
1254 *spread_weight.offset(i as isize) = 32 >> shift;
1255 i += 1;
1256 }
1257 if effectiveBytes > 50 && LM >= 1 && lfe == 0 {
1258 let mut last: i32 = 0;
1259 c = 0;
1260 loop {
1261 let mut offset: opus_val16 = 0.;
1262 let mut tmp: opus_val16 = 0.;
1263 let mut f: *mut opus_val16 = 0 as *mut opus_val16;
1264 f = &mut *follower.as_mut_ptr().offset((c * nbEBands) as isize) as *mut opus_val16;
1265 *f.offset(0 as isize) = *bandLogE2.offset((c * nbEBands) as isize);
1266 i = 1;
1267 while i < end {
1268 if *bandLogE2.offset((c * nbEBands + i) as isize)
1269 > *bandLogE2.offset((c * nbEBands + i - 1) as isize) + 0.5f32
1270 {
1271 last = i;
1272 }
1273 *f.offset(i as isize) = if *f.offset((i - 1) as isize) + 1.5f32
1274 < *bandLogE2.offset((c * nbEBands + i) as isize)
1275 {
1276 *f.offset((i - 1) as isize) + 1.5f32
1277 } else {
1278 *bandLogE2.offset((c * nbEBands + i) as isize)
1279 };
1280 i += 1;
1281 }
1282 i = last - 1;
1283 while i >= 0 {
1284 *f.offset(i as isize) = if *f.offset(i as isize)
1285 < (if *f.offset((i + 1) as isize) + 2.0f32
1286 < *bandLogE2.offset((c * nbEBands + i) as isize)
1287 {
1288 *f.offset((i + 1) as isize) + 2.0f32
1289 } else {
1290 *bandLogE2.offset((c * nbEBands + i) as isize)
1291 }) {
1292 *f.offset(i as isize)
1293 } else if *f.offset((i + 1) as isize) + 2.0f32
1294 < *bandLogE2.offset((c * nbEBands + i) as isize)
1295 {
1296 *f.offset((i + 1) as isize) + 2.0f32
1297 } else {
1298 *bandLogE2.offset((c * nbEBands + i) as isize)
1299 };
1300 i -= 1;
1301 }
1302 offset = 1.0f32;
1303 i = 2;
1304 while i < end - 2 {
1305 *f.offset(i as isize) = if *f.offset(i as isize)
1306 > median_of_5(&*bandLogE2.offset((c * nbEBands + i - 2) as isize)) - offset
1307 {
1308 *f.offset(i as isize)
1309 } else {
1310 median_of_5(&*bandLogE2.offset((c * nbEBands + i - 2) as isize)) - offset
1311 };
1312 i += 1;
1313 }
1314 tmp = median_of_3(&*bandLogE2.offset((c * nbEBands) as isize)) - offset;
1315 *f.offset(0 as isize) = if *f.offset(0 as isize) > tmp {
1316 *f.offset(0 as isize)
1317 } else {
1318 tmp
1319 };
1320 *f.offset(1 as isize) = if *f.offset(1 as isize) > tmp {
1321 *f.offset(1 as isize)
1322 } else {
1323 tmp
1324 };
1325 tmp = median_of_3(&*bandLogE2.offset((c * nbEBands + end - 3) as isize)) - offset;
1326 *f.offset((end - 2) as isize) = if *f.offset((end - 2) as isize) > tmp {
1327 *f.offset((end - 2) as isize)
1328 } else {
1329 tmp
1330 };
1331 *f.offset((end - 1) as isize) = if *f.offset((end - 1) as isize) > tmp {
1332 *f.offset((end - 1) as isize)
1333 } else {
1334 tmp
1335 };
1336 i = 0;
1337 while i < end {
1338 *f.offset(i as isize) =
1339 if *f.offset(i as isize) > *noise_floor.as_mut_ptr().offset(i as isize) {
1340 *f.offset(i as isize)
1341 } else {
1342 *noise_floor.as_mut_ptr().offset(i as isize)
1343 };
1344 i += 1;
1345 }
1346 c += 1;
1347 if !(c < C) {
1348 break;
1349 }
1350 }
1351 if C == 2 {
1352 i = start;
1353 while i < end {
1354 *follower.as_mut_ptr().offset((nbEBands + i) as isize) =
1355 if *follower.as_mut_ptr().offset((nbEBands + i) as isize)
1356 > *follower.as_mut_ptr().offset(i as isize) - 4.0f32
1357 {
1358 *follower.as_mut_ptr().offset((nbEBands + i) as isize)
1359 } else {
1360 *follower.as_mut_ptr().offset(i as isize) - 4.0f32
1361 };
1362 *follower.as_mut_ptr().offset(i as isize) =
1363 if *follower.as_mut_ptr().offset(i as isize)
1364 > *follower.as_mut_ptr().offset((nbEBands + i) as isize) - 4.0f32
1365 {
1366 *follower.as_mut_ptr().offset(i as isize)
1367 } else {
1368 *follower.as_mut_ptr().offset((nbEBands + i) as isize) - 4.0f32
1369 };
1370 *follower.as_mut_ptr().offset(i as isize) = 0.5f32
1371 * ((if 0 as f32
1372 > *bandLogE.offset(i as isize) - *follower.as_mut_ptr().offset(i as isize)
1373 {
1374 0 as f32
1375 } else {
1376 *bandLogE.offset(i as isize) - *follower.as_mut_ptr().offset(i as isize)
1377 }) + (if 0 as f32
1378 > *bandLogE.offset((nbEBands + i) as isize)
1379 - *follower.as_mut_ptr().offset((nbEBands + i) as isize)
1380 {
1381 0 as f32
1382 } else {
1383 *bandLogE.offset((nbEBands + i) as isize)
1384 - *follower.as_mut_ptr().offset((nbEBands + i) as isize)
1385 }));
1386 i += 1;
1387 }
1388 } else {
1389 i = start;
1390 while i < end {
1391 *follower.as_mut_ptr().offset(i as isize) = if 0 as f32
1392 > *bandLogE.offset(i as isize) - *follower.as_mut_ptr().offset(i as isize)
1393 {
1394 0 as f32
1395 } else {
1396 *bandLogE.offset(i as isize) - *follower.as_mut_ptr().offset(i as isize)
1397 };
1398 i += 1;
1399 }
1400 }
1401 i = start;
1402 while i < end {
1403 *follower.as_mut_ptr().offset(i as isize) = if *follower.as_mut_ptr().offset(i as isize)
1404 > *surround_dynalloc.offset(i as isize)
1405 {
1406 *follower.as_mut_ptr().offset(i as isize)
1407 } else {
1408 *surround_dynalloc.offset(i as isize)
1409 };
1410 i += 1;
1411 }
1412 i = start;
1413 while i < end {
1414 *importance.offset(i as isize) = (0.5f32
1415 + 13.0
1416 * celt_exp2(if *follower.as_mut_ptr().offset(i as isize) < 4.0f32 {
1417 *follower.as_mut_ptr().offset(i as isize)
1418 } else {
1419 4.0f32
1420 }))
1421 .floor() as i32;
1422 i += 1;
1423 }
1424 if (vbr == 0 || constrained_vbr != 0) && isTransient == 0 {
1425 i = start;
1426 while i < end {
1427 *follower.as_mut_ptr().offset(i as isize) =
1428 0.5f32 * *follower.as_mut_ptr().offset(i as isize);
1429 i += 1;
1430 }
1431 }
1432 i = start;
1433 while i < end {
1434 if i < 8 {
1435 let ref mut fresh1 = *follower.as_mut_ptr().offset(i as isize);
1436 *fresh1 *= 2 as f32;
1437 }
1438 if i >= 12 {
1439 *follower.as_mut_ptr().offset(i as isize) =
1440 0.5f32 * *follower.as_mut_ptr().offset(i as isize);
1441 }
1442 i += 1;
1443 }
1444 if (*analysis).valid != 0 {
1445 i = start;
1446 while i < (if (19) < end { 19 } else { end }) {
1447 *follower.as_mut_ptr().offset(i as isize) =
1448 *follower.as_mut_ptr().offset(i as isize)
1449 + 1.0f32 / 64.0f32 * (*analysis).leak_boost[i as usize] as i32 as f32;
1450 i += 1;
1451 }
1452 }
1453 i = start;
1454 while i < end {
1455 let mut width: i32 = 0;
1456 let mut boost: i32 = 0;
1457 let mut boost_bits: i32 = 0;
1458 *follower.as_mut_ptr().offset(i as isize) =
1459 if *follower.as_mut_ptr().offset(i as isize) < 4 as f32 {
1460 *follower.as_mut_ptr().offset(i as isize)
1461 } else {
1462 4 as f32
1463 };
1464 width = C
1465 * (*eBands.offset((i + 1) as isize) as i32 - *eBands.offset(i as isize) as i32)
1466 << LM;
1467 if width < 6 {
1468 boost = *follower.as_mut_ptr().offset(i as isize) as i32;
1469 boost_bits = boost * width << BITRES;
1470 } else if width > 48 {
1471 boost = (*follower.as_mut_ptr().offset(i as isize) * 8 as f32) as i32;
1472 boost_bits = (boost * width << BITRES) / 8;
1473 } else {
1474 boost =
1475 (*follower.as_mut_ptr().offset(i as isize) * width as f32 / 6 as f32) as i32;
1476 boost_bits = (boost * 6) << BITRES;
1477 }
1478 if (vbr == 0 || constrained_vbr != 0 && isTransient == 0)
1479 && tot_boost + boost_bits >> BITRES >> 3 > 2 * effectiveBytes / 3
1480 {
1481 let cap: i32 = (2 * effectiveBytes / 3) << BITRES << 3;
1482 *offsets.offset(i as isize) = cap - tot_boost;
1483 tot_boost = cap;
1484 break;
1485 } else {
1486 *offsets.offset(i as isize) = boost;
1487 tot_boost += boost_bits;
1488 i += 1;
1489 }
1490 }
1491 } else {
1492 i = start;
1493 while i < end {
1494 *importance.offset(i as isize) = 13;
1495 i += 1;
1496 }
1497 }
1498 *tot_boost_ = tot_boost;
1499 return maxDepth;
1500}
1501unsafe fn run_prefilter(
1502 st: *mut OpusCustomEncoder,
1503 in_0: *mut celt_sig,
1504 prefilter_mem: *mut celt_sig,
1505 CC: i32,
1506 N: i32,
1507 prefilter_tapset: i32,
1508 pitch: *mut i32,
1509 gain: *mut opus_val16,
1510 qgain: *mut i32,
1511 enabled: i32,
1512 nbAvailableBytes: i32,
1513 analysis: *mut AnalysisInfo,
1514) -> i32 {
1515 let mut c: i32 = 0;
1516 let mut pre: [*mut celt_sig; 2] = [0 as *mut celt_sig; 2];
1517 let mut mode: *const OpusCustomMode = 0 as *const OpusCustomMode;
1518 let mut pitch_index: i32 = 0;
1519 let mut gain1: opus_val16 = 0.;
1520 let mut pf_threshold: opus_val16 = 0.;
1521 let mut pf_on: i32 = 0;
1522 let mut qg: i32 = 0;
1523 let mut overlap: i32 = 0;
1524 mode = (*st).mode;
1525 overlap = (*mode).overlap;
1526 let vla = (CC * (N + 1024)) as usize;
1527 let mut _pre: Vec<celt_sig> = ::std::vec::from_elem(0., vla);
1528 pre[0 as usize] = _pre.as_mut_ptr();
1529 pre[1 as usize] = _pre
1530 .as_mut_ptr()
1531 .offset((N + COMBFILTER_MAXPERIOD) as isize);
1532 c = 0;
1533 loop {
1534 memcpy(
1535 pre[c as usize] as *mut core::ffi::c_void,
1536 prefilter_mem.offset((c * 1024) as isize) as *const core::ffi::c_void,
1537 (1024_u64)
1538 .wrapping_mul(::core::mem::size_of::<celt_sig>() as u64)
1539 .wrapping_add(
1540 (0 * (pre[c as usize]).offset_from(prefilter_mem.offset((c * 1024) as isize))
1541 as i64) as u64,
1542 ),
1543 );
1544 memcpy(
1545 (pre[c as usize]).offset(1024 as isize) as *mut core::ffi::c_void,
1546 in_0.offset((c * (N + overlap)) as isize)
1547 .offset(overlap as isize) as *const core::ffi::c_void,
1548 (N as u64)
1549 .wrapping_mul(::core::mem::size_of::<celt_sig>() as u64)
1550 .wrapping_add(
1551 (0 * (pre[c as usize]).offset(1024 as isize).offset_from(
1552 in_0.offset((c * (N + overlap)) as isize)
1553 .offset(overlap as isize),
1554 ) as i64) as u64,
1555 ),
1556 );
1557 c += 1;
1558 if !(c < CC) {
1559 break;
1560 }
1561 }
1562 if enabled != 0 {
1563 let vla_0 = (1024 + N >> 1) as usize;
1564 let mut pitch_buf: Vec<opus_val16> = ::std::vec::from_elem(0., vla_0);
1565 pitch_downsample(
1566 pre.as_mut_ptr() as *mut *mut celt_sig,
1567 pitch_buf.as_mut_ptr(),
1568 COMBFILTER_MAXPERIOD + N,
1569 CC,
1570 (*st).arch,
1571 );
1572 pitch_search(
1573 pitch_buf
1574 .as_mut_ptr()
1575 .offset((COMBFILTER_MAXPERIOD >> 1) as isize),
1576 pitch_buf.as_mut_ptr(),
1577 N,
1578 COMBFILTER_MAXPERIOD - 3 * COMBFILTER_MINPERIOD,
1579 &mut pitch_index,
1580 (*st).arch,
1581 );
1582 pitch_index = COMBFILTER_MAXPERIOD - pitch_index;
1583 gain1 = remove_doubling(
1584 pitch_buf.as_mut_ptr(),
1585 COMBFILTER_MAXPERIOD,
1586 COMBFILTER_MINPERIOD,
1587 N,
1588 &mut pitch_index,
1589 (*st).prefilter_period,
1590 (*st).prefilter_gain,
1591 (*st).arch,
1592 );
1593 if pitch_index > COMBFILTER_MAXPERIOD - 2 {
1594 pitch_index = COMBFILTER_MAXPERIOD - 2;
1595 }
1596 gain1 = 0.7f32 * gain1;
1597 if (*st).loss_rate > 2 {
1598 gain1 = 0.5f32 * gain1;
1599 }
1600 if (*st).loss_rate > 4 {
1601 gain1 = 0.5f32 * gain1;
1602 }
1603 if (*st).loss_rate > 8 {
1604 gain1 = 0 as opus_val16;
1605 }
1606 } else {
1607 gain1 = 0 as opus_val16;
1608 pitch_index = COMBFILTER_MINPERIOD;
1609 }
1610 if (*analysis).valid != 0 {
1611 gain1 = gain1 * (*analysis).max_pitch_ratio;
1612 }
1613 pf_threshold = 0.2f32;
1614 if (pitch_index - (*st).prefilter_period).abs() * 10 > pitch_index {
1615 pf_threshold += 0.2f32;
1616 }
1617 if nbAvailableBytes < 25 {
1618 pf_threshold += 0.1f32;
1619 }
1620 if nbAvailableBytes < 35 {
1621 pf_threshold += 0.1f32;
1622 }
1623 if (*st).prefilter_gain > 0.4f32 {
1624 pf_threshold -= 0.1f32;
1625 }
1626 if (*st).prefilter_gain > 0.55f32 {
1627 pf_threshold -= 0.1f32;
1628 }
1629 pf_threshold = if pf_threshold > 0.2f32 {
1630 pf_threshold
1631 } else {
1632 0.2f32
1633 };
1634 if gain1 < pf_threshold {
1635 gain1 = 0 as opus_val16;
1636 pf_on = 0;
1637 qg = 0;
1638 } else {
1639 if ((gain1 - (*st).prefilter_gain).abs()) < 0.1f32 {
1640 gain1 = (*st).prefilter_gain;
1641 }
1642 qg = (0.5f32 + gain1 * 32 as f32 / 3 as f32).floor() as i32 - 1;
1643 qg = if 0 > (if (7) < qg { 7 } else { qg }) {
1644 0
1645 } else if (7) < qg {
1646 7
1647 } else {
1648 qg
1649 };
1650 gain1 = 0.09375f32 * (qg + 1) as f32;
1651 pf_on = 1;
1652 }
1653 c = 0;
1654 loop {
1655 let offset: i32 = (*mode).shortMdctSize - overlap;
1656 (*st).prefilter_period = if (*st).prefilter_period > 15 {
1657 (*st).prefilter_period
1658 } else {
1659 15
1660 };
1661 memcpy(
1662 in_0.offset((c * (N + overlap)) as isize) as *mut core::ffi::c_void,
1663 ((*st).in_mem).as_mut_ptr().offset((c * overlap) as isize) as *const core::ffi::c_void,
1664 (overlap as u64)
1665 .wrapping_mul(::core::mem::size_of::<celt_sig>() as u64)
1666 .wrapping_add(
1667 (0 * in_0
1668 .offset((c * (N + overlap)) as isize)
1669 .offset_from(((*st).in_mem).as_mut_ptr().offset((c * overlap) as isize))
1670 as i64) as u64,
1671 ),
1672 );
1673 if offset != 0 {
1674 comb_filter(
1675 in_0.offset((c * (N + overlap)) as isize)
1676 .offset(overlap as isize),
1677 (pre[c as usize]).offset(COMBFILTER_MAXPERIOD as isize),
1678 (*st).prefilter_period,
1679 (*st).prefilter_period,
1680 offset,
1681 -(*st).prefilter_gain,
1682 -(*st).prefilter_gain,
1683 (*st).prefilter_tapset,
1684 (*st).prefilter_tapset,
1685 NULL as *const opus_val16,
1686 0,
1687 (*st).arch,
1688 );
1689 }
1690 comb_filter(
1691 in_0.offset((c * (N + overlap)) as isize)
1692 .offset(overlap as isize)
1693 .offset(offset as isize),
1694 (pre[c as usize])
1695 .offset(COMBFILTER_MAXPERIOD as isize)
1696 .offset(offset as isize),
1697 (*st).prefilter_period,
1698 pitch_index,
1699 N - offset,
1700 -(*st).prefilter_gain,
1701 -gain1,
1702 (*st).prefilter_tapset,
1703 prefilter_tapset,
1704 (*mode).window,
1705 overlap,
1706 (*st).arch,
1707 );
1708 memcpy(
1709 ((*st).in_mem).as_mut_ptr().offset((c * overlap) as isize) as *mut core::ffi::c_void,
1710 in_0.offset((c * (N + overlap)) as isize).offset(N as isize)
1711 as *const core::ffi::c_void,
1712 (overlap as u64)
1713 .wrapping_mul(::core::mem::size_of::<celt_sig>() as u64)
1714 .wrapping_add(
1715 (0 * ((*st).in_mem)
1716 .as_mut_ptr()
1717 .offset((c * overlap) as isize)
1718 .offset_from(in_0.offset((c * (N + overlap)) as isize).offset(N as isize))
1719 as i64) as u64,
1720 ),
1721 );
1722 if N > COMBFILTER_MAXPERIOD {
1723 memcpy(
1724 prefilter_mem.offset((c * 1024) as isize) as *mut core::ffi::c_void,
1725 (pre[c as usize]).offset(N as isize) as *const core::ffi::c_void,
1726 (1024_u64)
1727 .wrapping_mul(::core::mem::size_of::<celt_sig>() as u64)
1728 .wrapping_add(
1729 (0 * prefilter_mem
1730 .offset((c * 1024) as isize)
1731 .offset_from((pre[c as usize]).offset(N as isize))
1732 as i64) as u64,
1733 ),
1734 );
1735 } else {
1736 memmove(
1737 prefilter_mem.offset((c * 1024) as isize) as *mut core::ffi::c_void,
1738 prefilter_mem.offset((c * 1024) as isize).offset(N as isize)
1739 as *const core::ffi::c_void,
1740 ((1024 - N) as u64)
1741 .wrapping_mul(::core::mem::size_of::<celt_sig>() as u64)
1742 .wrapping_add(
1743 (0 * prefilter_mem.offset((c * 1024) as isize).offset_from(
1744 prefilter_mem.offset((c * 1024) as isize).offset(N as isize),
1745 ) as i64) as u64,
1746 ),
1747 );
1748 memcpy(
1749 prefilter_mem
1750 .offset((c * 1024) as isize)
1751 .offset(1024 as isize)
1752 .offset(-(N as isize)) as *mut core::ffi::c_void,
1753 (pre[c as usize]).offset(1024 as isize) as *const core::ffi::c_void,
1754 (N as u64)
1755 .wrapping_mul(::core::mem::size_of::<celt_sig>() as u64)
1756 .wrapping_add(
1757 (0 * prefilter_mem
1758 .offset((c * 1024) as isize)
1759 .offset(1024 as isize)
1760 .offset(-(N as isize))
1761 .offset_from((pre[c as usize]).offset(1024 as isize))
1762 as i64) as u64,
1763 ),
1764 );
1765 }
1766 c += 1;
1767 if !(c < CC) {
1768 break;
1769 }
1770 }
1771 *gain = gain1;
1772 *pitch = pitch_index;
1773 *qgain = qg;
1774 return pf_on;
1775}
1776unsafe fn compute_vbr(
1777 mode: *const OpusCustomMode,
1778 analysis: *mut AnalysisInfo,
1779 base_target: i32,
1780 LM: i32,
1781 bitrate: i32,
1782 lastCodedBands: i32,
1783 C: i32,
1784 intensity: i32,
1785 constrained_vbr: i32,
1786 mut stereo_saving: opus_val16,
1787 tot_boost: i32,
1788 tf_estimate: opus_val16,
1789 pitch_change: i32,
1790 maxDepth: opus_val16,
1791 lfe: i32,
1792 has_surround_mask: i32,
1793 surround_masking: opus_val16,
1794 temporal_vbr: opus_val16,
1795) -> i32 {
1796 let mut target: i32 = 0;
1797 let mut coded_bins: i32 = 0;
1798 let mut coded_bands: i32 = 0;
1799 let mut tf_calibration: opus_val16 = 0.;
1800 let mut nbEBands: i32 = 0;
1801 let mut eBands: *const i16 = 0 as *const i16;
1802 nbEBands = (*mode).nbEBands;
1803 eBands = (*mode).eBands;
1804 coded_bands = if lastCodedBands != 0 {
1805 lastCodedBands
1806 } else {
1807 nbEBands
1808 };
1809 coded_bins = (*eBands.offset(coded_bands as isize) as i32) << LM;
1810 if C == 2 {
1811 coded_bins += (*eBands.offset(
1812 (if intensity < coded_bands {
1813 intensity
1814 } else {
1815 coded_bands
1816 }) as isize,
1817 ) as i32)
1818 << LM;
1819 }
1820 target = base_target;
1821 if (*analysis).valid != 0 && ((*analysis).activity as f64) < 0.4f64 {
1822 target -= ((coded_bins << BITRES) as f32 * (0.4f32 - (*analysis).activity)) as i32;
1823 }
1824 if C == 2 {
1825 let mut coded_stereo_bands: i32 = 0;
1826 let mut coded_stereo_dof: i32 = 0;
1827 let mut max_frac: opus_val16 = 0.;
1828 coded_stereo_bands = if intensity < coded_bands {
1829 intensity
1830 } else {
1831 coded_bands
1832 };
1833 coded_stereo_dof =
1834 ((*eBands.offset(coded_stereo_bands as isize) as i32) << LM) - coded_stereo_bands;
1835 max_frac = 0.8f32 * coded_stereo_dof as opus_val32 / coded_bins as opus_val16;
1836 stereo_saving = if stereo_saving < 1.0f32 {
1837 stereo_saving
1838 } else {
1839 1.0f32
1840 };
1841 target -= (if (max_frac * target as f32)
1842 < (stereo_saving - 0.1f32) * (coded_stereo_dof << 3) as opus_val32
1843 {
1844 max_frac * target as f32
1845 } else {
1846 (stereo_saving - 0.1f32) * (coded_stereo_dof << 3) as opus_val32
1847 }) as i32;
1848 }
1849 target += tot_boost - ((19) << LM);
1850 tf_calibration = 0.044f32;
1851 target += ((tf_estimate - tf_calibration) * target as f32) as i32;
1852 if (*analysis).valid != 0 && lfe == 0 {
1853 let mut tonal_target: i32 = 0;
1854 let mut tonal: f32 = 0.;
1855 tonal = (if 0.0f32 > (*analysis).tonality - 0.15f32 {
1856 0.0f32
1857 } else {
1858 (*analysis).tonality - 0.15f32
1859 }) - 0.12f32;
1860 tonal_target = target + ((coded_bins << BITRES) as f32 * 1.2f32 * tonal) as i32;
1861 if pitch_change != 0 {
1862 tonal_target += ((coded_bins << BITRES) as f32 * 0.8f32) as i32;
1863 }
1864 target = tonal_target;
1865 }
1866 if has_surround_mask != 0 && lfe == 0 {
1867 let surround_target: i32 =
1868 target + (surround_masking * (coded_bins << 3) as opus_val32) as i32;
1869 target = if target / 4 > surround_target {
1870 target / 4
1871 } else {
1872 surround_target
1873 };
1874 }
1875 let mut floor_depth: i32 = 0;
1876 let mut bins: i32 = 0;
1877 bins = (*eBands.offset((nbEBands - 2) as isize) as i32) << LM;
1878 floor_depth = ((C * bins << 3) as opus_val32 * maxDepth) as i32;
1879 floor_depth = if floor_depth > target >> 2 {
1880 floor_depth
1881 } else {
1882 target >> 2
1883 };
1884 target = if target < floor_depth {
1885 target
1886 } else {
1887 floor_depth
1888 };
1889 if (has_surround_mask == 0 || lfe != 0) && constrained_vbr != 0 {
1890 target = base_target + (0.67f32 * (target - base_target) as f32) as i32;
1891 }
1892 if has_surround_mask == 0 && tf_estimate < 0.2f32 {
1893 let mut amount: opus_val16 = 0.;
1894 let mut tvbr_factor: opus_val16 = 0.;
1895 amount = 0.0000031f32
1896 * (if 0
1897 > (if (32000) < 96000 - bitrate {
1898 32000
1899 } else {
1900 96000 - bitrate
1901 })
1902 {
1903 0
1904 } else {
1905 if (32000) < 96000 - bitrate {
1906 32000
1907 } else {
1908 96000 - bitrate
1909 }
1910 }) as f32;
1911 tvbr_factor = temporal_vbr * amount;
1912 target += (tvbr_factor * target as f32) as i32;
1913 }
1914 target = if 2 * base_target < target {
1915 2 * base_target
1916 } else {
1917 target
1918 };
1919 return target;
1920}
1921pub unsafe fn celt_encode_with_ec(
1922 st: *mut OpusCustomEncoder,
1923 pcm: *const opus_val16,
1924 mut frame_size: i32,
1925 compressed: *mut u8,
1926 mut nbCompressedBytes: i32,
1927 mut enc: Option<&mut ec_enc>,
1928) -> i32 {
1929 let mut i: i32 = 0;
1930 let mut c: i32 = 0;
1931 let mut N: i32 = 0;
1932 let mut bits: i32 = 0;
1933 let mut _enc: ec_enc = ec_enc {
1934 buf: &mut [],
1935 storage: 0,
1936 end_offs: 0,
1937 end_window: 0,
1938 nend_bits: 0,
1939 nbits_total: 0,
1940 offs: 0,
1941 rng: 0,
1942 val: 0,
1943 ext: 0,
1944 rem: 0,
1945 error: 0,
1946 };
1947 let mut prefilter_mem: *mut celt_sig = 0 as *mut celt_sig;
1948 let mut oldBandE: *mut opus_val16 = 0 as *mut opus_val16;
1949 let mut oldLogE: *mut opus_val16 = 0 as *mut opus_val16;
1950 let mut oldLogE2: *mut opus_val16 = 0 as *mut opus_val16;
1951 let mut energyError: *mut opus_val16 = 0 as *mut opus_val16;
1952 let mut shortBlocks: i32 = 0;
1953 let mut isTransient: i32 = 0;
1954 let CC: i32 = (*st).channels;
1955 let C: i32 = (*st).stream_channels;
1956 let mut LM: i32 = 0;
1957 let mut M: i32 = 0;
1958 let mut tf_select: i32 = 0;
1959 let mut nbFilledBytes: i32 = 0;
1960 let mut nbAvailableBytes: i32 = 0;
1961 let mut start: i32 = 0;
1962 let mut end: i32 = 0;
1963 let mut effEnd: i32 = 0;
1964 let mut codedBands: i32 = 0;
1965 let mut alloc_trim: i32 = 0;
1966 let mut pitch_index: i32 = COMBFILTER_MINPERIOD;
1967 let mut gain1: opus_val16 = 0 as opus_val16;
1968 let mut dual_stereo: i32 = 0;
1969 let mut effectiveBytes: i32 = 0;
1970 let mut dynalloc_logp: i32 = 0;
1971 let mut vbr_rate: i32 = 0;
1972 let mut total_bits: i32 = 0;
1973 let mut total_boost: i32 = 0;
1974 let mut balance: i32 = 0;
1975 let mut tell: i32 = 0;
1976 let mut tell0_frac: i32 = 0;
1977 let mut prefilter_tapset: i32 = 0;
1978 let mut pf_on: i32 = 0;
1979 let mut anti_collapse_rsv: i32 = 0;
1980 let mut anti_collapse_on: i32 = 0;
1981 let mut silence: i32 = 0;
1982 let mut tf_chan: i32 = 0;
1983 let mut tf_estimate: opus_val16 = 0.;
1984 let mut pitch_change: i32 = 0;
1985 let mut tot_boost: i32 = 0;
1986 let mut sample_max: opus_val32 = 0.;
1987 let mut maxDepth: opus_val16 = 0.;
1988 let mut mode: *const OpusCustomMode = 0 as *const OpusCustomMode;
1989 let mut nbEBands: i32 = 0;
1990 let mut overlap: i32 = 0;
1991 let mut eBands: *const i16 = 0 as *const i16;
1992 let mut secondMdct: i32 = 0;
1993 let mut signalBandwidth: i32 = 0;
1994 let mut transient_got_disabled: i32 = 0;
1995 let mut surround_masking: opus_val16 = 0 as opus_val16;
1996 let mut temporal_vbr: opus_val16 = 0 as opus_val16;
1997 let mut surround_trim: opus_val16 = 0 as opus_val16;
1998 let mut equiv_rate: i32 = 0;
1999 let mut hybrid: i32 = 0;
2000 let mut weak_transient: i32 = 0;
2001 let mut enable_tf_analysis: i32 = 0;
2002 mode = (*st).mode;
2003 nbEBands = (*mode).nbEBands;
2004 overlap = (*mode).overlap;
2005 eBands = (*mode).eBands;
2006 start = (*st).start;
2007 end = (*st).end;
2008 hybrid = (start != 0) as i32;
2009 tf_estimate = 0 as opus_val16;
2010 if nbCompressedBytes < 2 || pcm.is_null() {
2011 return OPUS_BAD_ARG;
2012 }
2013 frame_size *= (*st).upsample;
2014 LM = 0;
2015 while LM <= (*mode).maxLM {
2016 if (*mode).shortMdctSize << LM == frame_size {
2017 break;
2018 }
2019 LM += 1;
2020 }
2021 if LM > (*mode).maxLM {
2022 return OPUS_BAD_ARG;
2023 }
2024 M = (1) << LM;
2025 N = M * (*mode).shortMdctSize;
2026 prefilter_mem = ((*st).in_mem).as_mut_ptr().offset((CC * overlap) as isize);
2027 oldBandE = ((*st).in_mem)
2028 .as_mut_ptr()
2029 .offset((CC * (overlap + COMBFILTER_MAXPERIOD)) as isize) as *mut opus_val16;
2030 oldLogE = oldBandE.offset((CC * nbEBands) as isize);
2031 oldLogE2 = oldLogE.offset((CC * nbEBands) as isize);
2032 energyError = oldLogE2.offset((CC * nbEBands) as isize);
2033 if let Some(enc) = enc.as_mut() {
2034 tell0_frac = ec_tell_frac(*enc) as i32;
2035 tell = ec_tell(*enc);
2036 nbFilledBytes = tell + 4 >> 3;
2037 } else {
2038 tell = 1;
2039 tell0_frac = tell;
2040 nbFilledBytes = 0;
2041 }
2042 assert!((*st).signalling == 0);
2043 nbCompressedBytes = if nbCompressedBytes < 1275 {
2044 nbCompressedBytes
2045 } else {
2046 1275
2047 };
2048 nbAvailableBytes = nbCompressedBytes - nbFilledBytes;
2049 if (*st).vbr != 0 && (*st).bitrate != OPUS_BITRATE_MAX {
2050 let den: i32 = (*mode).Fs >> BITRES;
2051 vbr_rate = ((*st).bitrate * frame_size + (den >> 1)) / den;
2052 effectiveBytes = vbr_rate >> 3 + BITRES;
2053 } else {
2054 let mut tmp: i32 = 0;
2055 vbr_rate = 0;
2056 tmp = (*st).bitrate * frame_size;
2057 if tell > 1 {
2058 tmp += tell;
2059 }
2060 if (*st).bitrate != OPUS_BITRATE_MAX {
2061 nbCompressedBytes = if 2
2062 > (if nbCompressedBytes
2063 < (tmp + 4 * (*mode).Fs) / (8 * (*mode).Fs) - ((*st).signalling != 0) as i32
2064 {
2065 nbCompressedBytes
2066 } else {
2067 (tmp + 4 * (*mode).Fs) / (8 * (*mode).Fs) - ((*st).signalling != 0) as i32
2068 }) {
2069 2
2070 } else if nbCompressedBytes
2071 < (tmp + 4 * (*mode).Fs) / (8 * (*mode).Fs) - ((*st).signalling != 0) as i32
2072 {
2073 nbCompressedBytes
2074 } else {
2075 (tmp + 4 * (*mode).Fs) / (8 * (*mode).Fs) - ((*st).signalling != 0) as i32
2076 };
2077 }
2078 effectiveBytes = nbCompressedBytes - nbFilledBytes;
2079 }
2080 equiv_rate = (nbCompressedBytes * 8 * 50 >> 3 - LM) - (40 * C + 20) * ((400 >> LM) - 50);
2081 if (*st).bitrate != OPUS_BITRATE_MAX {
2082 equiv_rate = if equiv_rate < (*st).bitrate - (40 * C + 20) * ((400 >> LM) - 50) {
2083 equiv_rate
2084 } else {
2085 (*st).bitrate - (40 * C + 20) * ((400 >> LM) - 50)
2086 };
2087 }
2088 let enc = if let Some(enc) = enc {
2089 enc
2090 } else {
2091 assert!(!compressed.is_null());
2092 _enc = ec_enc_init(std::slice::from_raw_parts_mut(
2093 compressed,
2094 nbCompressedBytes as usize,
2095 ));
2096 &mut _enc
2097 };
2098 if vbr_rate > 0 {
2099 if (*st).constrained_vbr != 0 {
2100 let mut vbr_bound: i32 = 0;
2101 let mut max_allowed: i32 = 0;
2102 vbr_bound = vbr_rate;
2103 max_allowed = if (if (if tell == 1 { 2 } else { 0 })
2104 > vbr_rate + vbr_bound - (*st).vbr_reservoir >> 3 + 3
2105 {
2106 if tell == 1 {
2107 2
2108 } else {
2109 0
2110 }
2111 } else {
2112 vbr_rate + vbr_bound - (*st).vbr_reservoir >> 3 + 3
2113 }) < nbAvailableBytes
2114 {
2115 if (if tell == 1 { 2 } else { 0 })
2116 > vbr_rate + vbr_bound - (*st).vbr_reservoir >> 3 + 3
2117 {
2118 if tell == 1 {
2119 2
2120 } else {
2121 0
2122 }
2123 } else {
2124 vbr_rate + vbr_bound - (*st).vbr_reservoir >> 3 + 3
2125 }
2126 } else {
2127 nbAvailableBytes
2128 };
2129 if max_allowed < nbAvailableBytes {
2130 nbCompressedBytes = nbFilledBytes + max_allowed;
2131 nbAvailableBytes = max_allowed;
2132 ec_enc_shrink(enc, nbCompressedBytes as u32);
2133 }
2134 }
2135 }
2136 total_bits = nbCompressedBytes * 8;
2137 effEnd = end;
2138 if effEnd > (*mode).effEBands {
2139 effEnd = (*mode).effEBands;
2140 }
2141 let vla = (CC * (N + overlap)) as usize;
2142 let mut in_0: Vec<celt_sig> = ::std::vec::from_elem(0., vla);
2143 sample_max = if (*st).overlap_max > celt_maxabs16(pcm, C * (N - overlap) / (*st).upsample) {
2144 (*st).overlap_max
2145 } else {
2146 celt_maxabs16(pcm, C * (N - overlap) / (*st).upsample)
2147 };
2148 (*st).overlap_max = celt_maxabs16(
2149 pcm.offset((C * (N - overlap) / (*st).upsample) as isize),
2150 C * overlap / (*st).upsample,
2151 );
2152 sample_max = if sample_max > (*st).overlap_max {
2153 sample_max
2154 } else {
2155 (*st).overlap_max
2156 };
2157 silence = (sample_max <= 1 as opus_val16 / ((1) << (*st).lsb_depth) as f32) as i32;
2158 if tell == 1 {
2159 ec_enc_bit_logp(enc, silence, 15);
2160 } else {
2161 silence = 0;
2162 }
2163 if silence != 0 {
2164 if vbr_rate > 0 {
2165 nbCompressedBytes = if nbCompressedBytes < nbFilledBytes + 2 {
2166 nbCompressedBytes
2167 } else {
2168 nbFilledBytes + 2
2169 };
2170 effectiveBytes = nbCompressedBytes;
2171 total_bits = nbCompressedBytes * 8;
2172 nbAvailableBytes = 2;
2173 ec_enc_shrink(enc, nbCompressedBytes as u32);
2174 }
2175 tell = nbCompressedBytes * 8;
2176 (*enc).nbits_total += tell - ec_tell(enc);
2177 }
2178 c = 0;
2179 loop {
2180 let mut need_clip: i32 = 0;
2181 need_clip = ((*st).clip != 0 && sample_max > 65536.0f32) as i32;
2182 celt_preemphasis(
2183 pcm.offset(c as isize),
2184 in_0.as_mut_ptr()
2185 .offset((c * (N + overlap)) as isize)
2186 .offset(overlap as isize),
2187 N,
2188 CC,
2189 (*st).upsample,
2190 ((*mode).preemph).as_ptr(),
2191 ((*st).preemph_memE).as_mut_ptr().offset(c as isize),
2192 need_clip,
2193 );
2194 c += 1;
2195 if !(c < CC) {
2196 break;
2197 }
2198 }
2199 let mut enabled: i32 = 0;
2200 let mut qg: i32 = 0;
2201 enabled = (((*st).lfe != 0 && nbAvailableBytes > 3 || nbAvailableBytes > 12 * C)
2202 && hybrid == 0
2203 && silence == 0
2204 && (*st).disable_pf == 0
2205 && (*st).complexity >= 5) as i32;
2206 prefilter_tapset = (*st).tapset_decision;
2207 pf_on = run_prefilter(
2208 st,
2209 in_0.as_mut_ptr(),
2210 prefilter_mem,
2211 CC,
2212 N,
2213 prefilter_tapset,
2214 &mut pitch_index,
2215 &mut gain1,
2216 &mut qg,
2217 enabled,
2218 nbAvailableBytes,
2219 &mut (*st).analysis,
2220 );
2221 #[cfg(feature = "ent-dump")]
2222 eprintln!("prefilter: pitch_index={pitch_index}, gain1={gain1:1.6}, qg={qg}");
2223 if (gain1 > 0.4f32 || (*st).prefilter_gain > 0.4f32)
2224 && ((*st).analysis.valid == 0 || (*st).analysis.tonality as f64 > 0.3f64)
2225 && (pitch_index as f64 > 1.26f64 * (*st).prefilter_period as f64
2226 || (pitch_index as f64) < 0.79f64 * (*st).prefilter_period as f64)
2227 {
2228 pitch_change = 1;
2229 }
2230 if pf_on == 0 {
2231 if hybrid == 0 && tell + 16 <= total_bits {
2232 ec_enc_bit_logp(enc, 0, 1);
2233 }
2234 } else {
2235 let mut octave: i32 = 0;
2236 ec_enc_bit_logp(enc, 1, 1);
2237 pitch_index += 1;
2238 octave = EC_CLZ0 - (pitch_index as u32).leading_zeros() as i32 - 5;
2239 ec_enc_uint(enc, octave as u32, 6);
2240 ec_enc_bits(
2241 enc,
2242 (pitch_index - ((16) << octave)) as u32,
2243 (4 + octave) as u32,
2244 );
2245 pitch_index -= 1;
2246 ec_enc_bits(enc, qg as u32, 3);
2247 ec_enc_icdf(enc, prefilter_tapset, &tapset_icdf, 2);
2248 }
2249 isTransient = 0;
2250 shortBlocks = 0;
2251 if (*st).complexity >= 1 && (*st).lfe == 0 {
2252 let allow_weak_transients: i32 =
2253 (hybrid != 0 && effectiveBytes < 15 && (*st).silk_info.signalType != 2) as i32;
2254 isTransient = transient_analysis(
2255 in_0.as_mut_ptr(),
2256 N + overlap,
2257 CC,
2258 &mut tf_estimate,
2259 &mut tf_chan,
2260 allow_weak_transients,
2261 &mut weak_transient,
2262 );
2263 }
2264 if LM > 0 && ec_tell(enc) + 3 <= total_bits {
2265 if isTransient != 0 {
2266 shortBlocks = M;
2267 }
2268 } else {
2269 isTransient = 0;
2270 transient_got_disabled = 1;
2271 }
2272 let vla_0 = (CC * N) as usize;
2273 let mut freq: Vec<celt_sig> = ::std::vec::from_elem(0., vla_0);
2274 let vla_1 = (nbEBands * CC) as usize;
2275 let mut bandE: Vec<celt_ener> = ::std::vec::from_elem(0., vla_1);
2276 let vla_2 = (nbEBands * CC) as usize;
2277 let mut bandLogE: Vec<opus_val16> = ::std::vec::from_elem(0., vla_2);
2278 secondMdct = (shortBlocks != 0 && (*st).complexity >= 8) as i32;
2279 let vla_3 = (C * nbEBands) as usize;
2280 let mut bandLogE2: Vec<opus_val16> = ::std::vec::from_elem(0., vla_3);
2281 if secondMdct != 0 {
2282 compute_mdcts(
2283 mode,
2284 0,
2285 in_0.as_mut_ptr(),
2286 freq.as_mut_ptr(),
2287 C,
2288 CC,
2289 LM,
2290 (*st).upsample,
2291 (*st).arch,
2292 );
2293 compute_band_energies(
2294 mode,
2295 freq.as_mut_ptr(),
2296 bandE.as_mut_ptr(),
2297 effEnd,
2298 C,
2299 LM,
2300 (*st).arch,
2301 );
2302 amp2Log2(
2303 mode,
2304 effEnd,
2305 end,
2306 bandE.as_mut_ptr(),
2307 bandLogE2.as_mut_ptr(),
2308 C,
2309 );
2310 i = 0;
2311 while i < C * nbEBands {
2312 let ref mut fresh2 = *bandLogE2.as_mut_ptr().offset(i as isize);
2313 *fresh2 += 0.5f32 * LM as f32;
2314 i += 1;
2315 }
2316 }
2317 compute_mdcts(
2318 mode,
2319 shortBlocks,
2320 in_0.as_mut_ptr(),
2321 freq.as_mut_ptr(),
2322 C,
2323 CC,
2324 LM,
2325 (*st).upsample,
2326 (*st).arch,
2327 );
2328 assert!(
2329 !(*freq.as_mut_ptr().offset(0 as isize) != *freq.as_mut_ptr().offset(0 as isize))
2330 && (C == 1
2331 || !(*freq.as_mut_ptr().offset(N as isize)
2332 != *freq.as_mut_ptr().offset(N as isize)))
2333 );
2334 if CC == 2 && C == 1 {
2335 tf_chan = 0;
2336 }
2337 compute_band_energies(
2338 mode,
2339 freq.as_mut_ptr(),
2340 bandE.as_mut_ptr(),
2341 effEnd,
2342 C,
2343 LM,
2344 (*st).arch,
2345 );
2346 if (*st).lfe != 0 {
2347 i = 2;
2348 while i < end {
2349 *bandE.as_mut_ptr().offset(i as isize) = if *bandE.as_mut_ptr().offset(i as isize)
2350 < 1e-4f32 * *bandE.as_mut_ptr().offset(0 as isize)
2351 {
2352 *bandE.as_mut_ptr().offset(i as isize)
2353 } else {
2354 1e-4f32 * *bandE.as_mut_ptr().offset(0 as isize)
2355 };
2356 *bandE.as_mut_ptr().offset(i as isize) =
2357 if *bandE.as_mut_ptr().offset(i as isize) > 1e-15f32 {
2358 *bandE.as_mut_ptr().offset(i as isize)
2359 } else {
2360 1e-15f32
2361 };
2362 i += 1;
2363 }
2364 }
2365 amp2Log2(
2366 mode,
2367 effEnd,
2368 end,
2369 bandE.as_mut_ptr(),
2370 bandLogE.as_mut_ptr(),
2371 C,
2372 );
2373 let vla_4 = (C * nbEBands) as usize;
2374 let mut surround_dynalloc: Vec<opus_val16> = ::std::vec::from_elem(0., vla_4);
2375 memset(
2376 surround_dynalloc.as_mut_ptr() as *mut core::ffi::c_void,
2377 0,
2378 (end as u64).wrapping_mul(::core::mem::size_of::<opus_val16>() as u64),
2379 );
2380 if hybrid == 0 && !((*st).energy_mask).is_null() && (*st).lfe == 0 {
2381 let mut mask_end: i32 = 0;
2382 let mut midband: i32 = 0;
2383 let mut count_dynalloc: i32 = 0;
2384 let mut mask_avg: opus_val32 = 0 as opus_val32;
2385 let mut diff: opus_val32 = 0 as opus_val32;
2386 let mut count: i32 = 0;
2387 mask_end = if 2 > (*st).lastCodedBands {
2388 2
2389 } else {
2390 (*st).lastCodedBands
2391 };
2392 c = 0;
2393 while c < C {
2394 i = 0;
2395 while i < mask_end {
2396 let mut mask: opus_val16 = 0.;
2397 mask = if (if *((*st).energy_mask).offset((nbEBands * c + i) as isize) < 0.25f32 {
2398 *((*st).energy_mask).offset((nbEBands * c + i) as isize)
2399 } else {
2400 0.25f32
2401 }) > -2.0f32
2402 {
2403 if *((*st).energy_mask).offset((nbEBands * c + i) as isize) < 0.25f32 {
2404 *((*st).energy_mask).offset((nbEBands * c + i) as isize)
2405 } else {
2406 0.25f32
2407 }
2408 } else {
2409 -2.0f32
2410 };
2411 if mask > 0 as f32 {
2412 mask = 0.5f32 * mask;
2413 }
2414 mask_avg += mask
2415 * (*eBands.offset((i + 1) as isize) as i32 - *eBands.offset(i as isize) as i32)
2416 as opus_val32;
2417 count +=
2418 *eBands.offset((i + 1) as isize) as i32 - *eBands.offset(i as isize) as i32;
2419 diff += mask * (1 + 2 * i - mask_end) as opus_val32;
2420 i += 1;
2421 }
2422 c += 1;
2423 }
2424 assert!(count > 0);
2425 mask_avg = mask_avg / count as opus_val16;
2426 mask_avg += 0.2f32;
2427 diff = diff * 6 as f32 / (C * (mask_end - 1) * (mask_end + 1) * mask_end) as f32;
2428 diff = 0.5f32 * diff;
2429 diff = if (if diff < 0.031f32 { diff } else { 0.031f32 }) > -0.031f32 {
2430 if diff < 0.031f32 {
2431 diff
2432 } else {
2433 0.031f32
2434 }
2435 } else {
2436 -0.031f32
2437 };
2438 midband = 0;
2439 while (*eBands.offset((midband + 1) as isize) as i32)
2440 < *eBands.offset(mask_end as isize) as i32 / 2
2441 {
2442 midband += 1;
2443 }
2444 count_dynalloc = 0;
2445 i = 0;
2446 while i < mask_end {
2447 let mut lin: opus_val32 = 0.;
2448 let mut unmask: opus_val16 = 0.;
2449 lin = mask_avg + diff * (i - midband) as f32;
2450 if C == 2 {
2451 unmask = if *((*st).energy_mask).offset(i as isize)
2452 > *((*st).energy_mask).offset((nbEBands + i) as isize)
2453 {
2454 *((*st).energy_mask).offset(i as isize)
2455 } else {
2456 *((*st).energy_mask).offset((nbEBands + i) as isize)
2457 };
2458 } else {
2459 unmask = *((*st).energy_mask).offset(i as isize);
2460 }
2461 unmask = if unmask < 0.0f32 { unmask } else { 0.0f32 };
2462 unmask -= lin;
2463 if unmask > 0.25f32 {
2464 *surround_dynalloc.as_mut_ptr().offset(i as isize) = unmask - 0.25f32;
2465 count_dynalloc += 1;
2466 }
2467 i += 1;
2468 }
2469 if count_dynalloc >= 3 {
2470 mask_avg += 0.25f32;
2471 if mask_avg > 0 as f32 {
2472 mask_avg = 0 as opus_val32;
2473 diff = 0 as opus_val32;
2474 memset(
2475 surround_dynalloc.as_mut_ptr() as *mut core::ffi::c_void,
2476 0,
2477 (mask_end as u64).wrapping_mul(::core::mem::size_of::<opus_val16>() as u64),
2478 );
2479 } else {
2480 i = 0;
2481 while i < mask_end {
2482 *surround_dynalloc.as_mut_ptr().offset(i as isize) = if 0 as f32
2483 > *surround_dynalloc.as_mut_ptr().offset(i as isize) - 0.25f32
2484 {
2485 0 as f32
2486 } else {
2487 *surround_dynalloc.as_mut_ptr().offset(i as isize) - 0.25f32
2488 };
2489 i += 1;
2490 }
2491 }
2492 }
2493 mask_avg += 0.2f32;
2494 surround_trim = 64 as f32 * diff;
2495 surround_masking = mask_avg;
2496 }
2497 if (*st).lfe == 0 {
2498 let mut follow: opus_val16 = -10.0f32;
2499 let mut frame_avg: opus_val32 = 0 as opus_val32;
2500 let offset: opus_val16 = if shortBlocks != 0 {
2501 0.5f32 * LM as f32
2502 } else {
2503 0 as f32
2504 };
2505 i = start;
2506 while i < end {
2507 follow = if follow - 1.0f32 > *bandLogE.as_mut_ptr().offset(i as isize) - offset {
2508 follow - 1.0f32
2509 } else {
2510 *bandLogE.as_mut_ptr().offset(i as isize) - offset
2511 };
2512 if C == 2 {
2513 follow = if follow > *bandLogE.as_mut_ptr().offset((i + nbEBands) as isize) - offset
2514 {
2515 follow
2516 } else {
2517 *bandLogE.as_mut_ptr().offset((i + nbEBands) as isize) - offset
2518 };
2519 }
2520 frame_avg += follow;
2521 i += 1;
2522 }
2523 frame_avg /= (end - start) as f32;
2524 temporal_vbr = frame_avg - (*st).spec_avg;
2525 temporal_vbr = if 3.0f32
2526 < (if -1.5f32 > temporal_vbr {
2527 -1.5f32
2528 } else {
2529 temporal_vbr
2530 }) {
2531 3.0f32
2532 } else if -1.5f32 > temporal_vbr {
2533 -1.5f32
2534 } else {
2535 temporal_vbr
2536 };
2537 (*st).spec_avg += 0.02f32 * temporal_vbr;
2538 }
2539 if secondMdct == 0 {
2540 memcpy(
2541 bandLogE2.as_mut_ptr() as *mut core::ffi::c_void,
2542 bandLogE.as_mut_ptr() as *const core::ffi::c_void,
2543 ((C * nbEBands) as u64)
2544 .wrapping_mul(::core::mem::size_of::<opus_val16>() as u64)
2545 .wrapping_add(
2546 (0 * bandLogE2.as_mut_ptr().offset_from(bandLogE.as_mut_ptr()) as i64) as u64,
2547 ),
2548 );
2549 }
2550 if LM > 0
2551 && ec_tell(enc) + 3 <= total_bits
2552 && isTransient == 0
2553 && (*st).complexity >= 5
2554 && (*st).lfe == 0
2555 && hybrid == 0
2556 {
2557 if patch_transient_decision(bandLogE.as_mut_ptr(), oldBandE, nbEBands, start, end, C) != 0 {
2558 isTransient = 1;
2559 shortBlocks = M;
2560 compute_mdcts(
2561 mode,
2562 shortBlocks,
2563 in_0.as_mut_ptr(),
2564 freq.as_mut_ptr(),
2565 C,
2566 CC,
2567 LM,
2568 (*st).upsample,
2569 (*st).arch,
2570 );
2571 compute_band_energies(
2572 mode,
2573 freq.as_mut_ptr(),
2574 bandE.as_mut_ptr(),
2575 effEnd,
2576 C,
2577 LM,
2578 (*st).arch,
2579 );
2580 amp2Log2(
2581 mode,
2582 effEnd,
2583 end,
2584 bandE.as_mut_ptr(),
2585 bandLogE.as_mut_ptr(),
2586 C,
2587 );
2588 i = 0;
2589 while i < C * nbEBands {
2590 let ref mut fresh3 = *bandLogE2.as_mut_ptr().offset(i as isize);
2591 *fresh3 += 0.5f32 * LM as f32;
2592 i += 1;
2593 }
2594 tf_estimate = 0.2f32;
2595 }
2596 }
2597 if LM > 0 && ec_tell(enc) + 3 <= total_bits {
2598 ec_enc_bit_logp(enc, isTransient, 3);
2599 }
2600 let vla_5 = (C * N) as usize;
2601 let mut X: Vec<celt_norm> = ::std::vec::from_elem(0., vla_5);
2602 normalise_bands(
2603 mode,
2604 freq.as_mut_ptr(),
2605 X.as_mut_ptr(),
2606 bandE.as_mut_ptr(),
2607 effEnd,
2608 C,
2609 M,
2610 );
2611 enable_tf_analysis =
2612 (effectiveBytes >= 15 * C && hybrid == 0 && (*st).complexity >= 2 && (*st).lfe == 0) as i32;
2613 let vla_6 = nbEBands as usize;
2614 let mut offsets: Vec<i32> = ::std::vec::from_elem(0, vla_6);
2615 let vla_7 = nbEBands as usize;
2616 let mut importance: Vec<i32> = ::std::vec::from_elem(0, vla_7);
2617 let vla_8 = nbEBands as usize;
2618 let mut spread_weight: Vec<i32> = ::std::vec::from_elem(0, vla_8);
2619 maxDepth = dynalloc_analysis(
2620 bandLogE.as_mut_ptr(),
2621 bandLogE2.as_mut_ptr(),
2622 nbEBands,
2623 start,
2624 end,
2625 C,
2626 offsets.as_mut_ptr(),
2627 (*st).lsb_depth,
2628 (*mode).logN,
2629 isTransient,
2630 (*st).vbr,
2631 (*st).constrained_vbr,
2632 eBands,
2633 LM,
2634 effectiveBytes,
2635 &mut tot_boost,
2636 (*st).lfe,
2637 surround_dynalloc.as_mut_ptr(),
2638 &mut (*st).analysis,
2639 importance.as_mut_ptr(),
2640 spread_weight.as_mut_ptr(),
2641 );
2642 let vla_9 = nbEBands as usize;
2643 let mut tf_res: Vec<i32> = ::std::vec::from_elem(0, vla_9);
2644 if enable_tf_analysis != 0 {
2645 let mut lambda: i32 = 0;
2646 lambda = if 80 > 20480 / effectiveBytes + 2 {
2647 80
2648 } else {
2649 20480 / effectiveBytes + 2
2650 };
2651 tf_select = tf_analysis(
2652 mode,
2653 effEnd,
2654 isTransient,
2655 tf_res.as_mut_ptr(),
2656 lambda,
2657 X.as_mut_ptr(),
2658 N,
2659 LM,
2660 tf_estimate,
2661 tf_chan,
2662 importance.as_mut_ptr(),
2663 );
2664 i = effEnd;
2665 while i < end {
2666 *tf_res.as_mut_ptr().offset(i as isize) =
2667 *tf_res.as_mut_ptr().offset((effEnd - 1) as isize);
2668 i += 1;
2669 }
2670 } else if hybrid != 0 && weak_transient != 0 {
2671 i = 0;
2672 while i < end {
2673 *tf_res.as_mut_ptr().offset(i as isize) = 1;
2674 i += 1;
2675 }
2676 tf_select = 0;
2677 } else if hybrid != 0 && effectiveBytes < 15 && (*st).silk_info.signalType != 2 {
2678 i = 0;
2679 while i < end {
2680 *tf_res.as_mut_ptr().offset(i as isize) = 0;
2681 i += 1;
2682 }
2683 tf_select = isTransient;
2684 } else {
2685 i = 0;
2686 while i < end {
2687 *tf_res.as_mut_ptr().offset(i as isize) = isTransient;
2688 i += 1;
2689 }
2690 tf_select = 0;
2691 }
2692 let vla_10 = (C * nbEBands) as usize;
2693 let mut error: Vec<opus_val16> = ::std::vec::from_elem(0., vla_10);
2694 c = 0;
2695 loop {
2696 i = start;
2697 while i < end {
2698 if (*bandLogE.as_mut_ptr().offset((i + c * nbEBands) as isize)
2699 - *oldBandE.offset((i + c * nbEBands) as isize))
2700 .abs()
2701 < 2.0f32
2702 {
2703 let ref mut fresh4 = *bandLogE.as_mut_ptr().offset((i + c * nbEBands) as isize);
2704 *fresh4 -= *energyError.offset((i + c * nbEBands) as isize) * 0.25f32;
2705 }
2706 i += 1;
2707 }
2708 c += 1;
2709 if !(c < C) {
2710 break;
2711 }
2712 }
2713 quant_coarse_energy(
2714 mode,
2715 start,
2716 end,
2717 effEnd,
2718 bandLogE.as_mut_ptr(),
2719 oldBandE,
2720 total_bits as u32,
2721 error.as_mut_ptr(),
2722 enc,
2723 C,
2724 LM,
2725 nbAvailableBytes,
2726 (*st).force_intra,
2727 &mut (*st).delayedIntra,
2728 ((*st).complexity >= 4) as i32,
2729 (*st).loss_rate,
2730 (*st).lfe,
2731 );
2732 tf_encode(
2733 start,
2734 end,
2735 isTransient,
2736 tf_res.as_mut_ptr(),
2737 LM,
2738 tf_select,
2739 enc,
2740 );
2741 if ec_tell(enc) + 4 <= total_bits {
2742 if (*st).lfe != 0 {
2743 (*st).tapset_decision = 0;
2744 (*st).spread_decision = SPREAD_NORMAL;
2745 } else if hybrid != 0 {
2746 if (*st).complexity == 0 {
2747 (*st).spread_decision = SPREAD_NONE;
2748 } else if isTransient != 0 {
2749 (*st).spread_decision = SPREAD_NORMAL;
2750 } else {
2751 (*st).spread_decision = SPREAD_AGGRESSIVE;
2752 }
2753 } else if shortBlocks != 0 || (*st).complexity < 3 || nbAvailableBytes < 10 * C {
2754 if (*st).complexity == 0 {
2755 (*st).spread_decision = SPREAD_NONE;
2756 } else {
2757 (*st).spread_decision = SPREAD_NORMAL;
2758 }
2759 } else {
2760 (*st).spread_decision = spreading_decision(
2761 mode,
2762 X.as_mut_ptr(),
2763 &mut (*st).tonal_average,
2764 (*st).spread_decision,
2765 &mut (*st).hf_average,
2766 &mut (*st).tapset_decision,
2767 (pf_on != 0 && shortBlocks == 0) as i32,
2768 effEnd,
2769 C,
2770 M,
2771 spread_weight.as_mut_ptr(),
2772 );
2773 }
2774 ec_enc_icdf(enc, (*st).spread_decision, &spread_icdf, 5);
2775 }
2776 if (*st).lfe != 0 {
2777 *offsets.as_mut_ptr().offset(0 as isize) = if (8) < effectiveBytes / 3 {
2778 8
2779 } else {
2780 effectiveBytes / 3
2781 };
2782 }
2783 let vla_11 = nbEBands as usize;
2784 let mut cap: Vec<i32> = ::std::vec::from_elem(0, vla_11);
2785 init_caps(mode, cap.as_mut_ptr(), LM, C);
2786 dynalloc_logp = 6;
2787 total_bits <<= BITRES;
2788 total_boost = 0;
2789 tell = ec_tell_frac(enc) as i32;
2790 i = start;
2791 while i < end {
2792 let mut width: i32 = 0;
2793 let mut quanta: i32 = 0;
2794 let mut dynalloc_loop_logp: i32 = 0;
2795 let mut boost: i32 = 0;
2796 let mut j: i32 = 0;
2797 width =
2798 C * (*eBands.offset((i + 1) as isize) as i32 - *eBands.offset(i as isize) as i32) << LM;
2799 quanta = if (width << 3) < (if (6) << 3 > width { (6) << 3 } else { width }) {
2800 width << 3
2801 } else if (6) << 3 > width {
2802 (6) << 3
2803 } else {
2804 width
2805 };
2806 dynalloc_loop_logp = dynalloc_logp;
2807 boost = 0;
2808 j = 0;
2809 while tell + (dynalloc_loop_logp << BITRES) < total_bits - total_boost
2810 && boost < *cap.as_mut_ptr().offset(i as isize)
2811 {
2812 let mut flag: i32 = 0;
2813 flag = (j < *offsets.as_mut_ptr().offset(i as isize)) as i32;
2814 ec_enc_bit_logp(enc, flag, dynalloc_loop_logp as u32);
2815 tell = ec_tell_frac(enc) as i32;
2816 if flag == 0 {
2817 break;
2818 }
2819 boost += quanta;
2820 total_boost += quanta;
2821 dynalloc_loop_logp = 1;
2822 j += 1;
2823 }
2824 if j != 0 {
2825 dynalloc_logp = if 2 > dynalloc_logp - 1 {
2826 2
2827 } else {
2828 dynalloc_logp - 1
2829 };
2830 }
2831 *offsets.as_mut_ptr().offset(i as isize) = boost;
2832 i += 1;
2833 }
2834 if C == 2 {
2835 static mut intensity_thresholds: [opus_val16; 21] = [
2836 1 as opus_val16,
2837 2 as opus_val16,
2838 3 as opus_val16,
2839 4 as opus_val16,
2840 5 as opus_val16,
2841 6 as opus_val16,
2842 7 as opus_val16,
2843 8 as opus_val16,
2844 16 as opus_val16,
2845 24 as opus_val16,
2846 36 as opus_val16,
2847 44 as opus_val16,
2848 50 as opus_val16,
2849 56 as opus_val16,
2850 62 as opus_val16,
2851 67 as opus_val16,
2852 72 as opus_val16,
2853 79 as opus_val16,
2854 88 as opus_val16,
2855 106 as opus_val16,
2856 134 as opus_val16,
2857 ];
2858 static mut intensity_histeresis: [opus_val16; 21] = [
2859 1 as opus_val16,
2860 1 as opus_val16,
2861 1 as opus_val16,
2862 1 as opus_val16,
2863 1 as opus_val16,
2864 1 as opus_val16,
2865 1 as opus_val16,
2866 2 as opus_val16,
2867 2 as opus_val16,
2868 2 as opus_val16,
2869 2 as opus_val16,
2870 2 as opus_val16,
2871 2 as opus_val16,
2872 2 as opus_val16,
2873 3 as opus_val16,
2874 3 as opus_val16,
2875 4 as opus_val16,
2876 5 as opus_val16,
2877 6 as opus_val16,
2878 8 as opus_val16,
2879 8 as opus_val16,
2880 ];
2881 if LM != 0 {
2882 dual_stereo = stereo_analysis(mode, X.as_mut_ptr(), LM, N);
2883 }
2884 (*st).intensity = hysteresis_decision(
2885 (equiv_rate / 1000) as opus_val16,
2886 intensity_thresholds.as_ptr(),
2887 intensity_histeresis.as_ptr(),
2888 21,
2889 (*st).intensity,
2890 );
2891 (*st).intensity = if end
2892 < (if start > (*st).intensity {
2893 start
2894 } else {
2895 (*st).intensity
2896 }) {
2897 end
2898 } else if start > (*st).intensity {
2899 start
2900 } else {
2901 (*st).intensity
2902 };
2903 }
2904 alloc_trim = 5;
2905 if tell + ((6) << BITRES) <= total_bits - total_boost {
2906 if start > 0 || (*st).lfe != 0 {
2907 (*st).stereo_saving = 0 as opus_val16;
2908 alloc_trim = 5;
2909 } else {
2910 alloc_trim = alloc_trim_analysis(
2911 mode,
2912 X.as_mut_ptr(),
2913 bandLogE.as_mut_ptr(),
2914 end,
2915 LM,
2916 C,
2917 N,
2918 &mut (*st).analysis,
2919 &mut (*st).stereo_saving,
2920 tf_estimate,
2921 (*st).intensity,
2922 surround_trim,
2923 equiv_rate,
2924 (*st).arch,
2925 );
2926 }
2927 ec_enc_icdf(enc, alloc_trim, &trim_icdf, 7);
2928 tell = ec_tell_frac(enc) as i32;
2929 }
2930 if vbr_rate > 0 {
2931 let mut alpha: opus_val16 = 0.;
2932 let mut delta: i32 = 0;
2933 let mut target: i32 = 0;
2934 let mut base_target: i32 = 0;
2935 let mut min_allowed: i32 = 0;
2936 let lm_diff: i32 = (*mode).maxLM - LM;
2937 nbCompressedBytes = if nbCompressedBytes < 1275 >> 3 - LM {
2938 nbCompressedBytes
2939 } else {
2940 1275 >> 3 - LM
2941 };
2942 if hybrid == 0 {
2943 base_target = vbr_rate - ((40 * C + 20) << BITRES);
2944 } else {
2945 base_target = if 0 > vbr_rate - ((9 * C + 4) << 3) {
2946 0
2947 } else {
2948 vbr_rate - ((9 * C + 4) << 3)
2949 };
2950 }
2951 if (*st).constrained_vbr != 0 {
2952 base_target += (*st).vbr_offset >> lm_diff;
2953 }
2954 if hybrid == 0 {
2955 target = compute_vbr(
2956 mode,
2957 &mut (*st).analysis,
2958 base_target,
2959 LM,
2960 equiv_rate,
2961 (*st).lastCodedBands,
2962 C,
2963 (*st).intensity,
2964 (*st).constrained_vbr,
2965 (*st).stereo_saving,
2966 tot_boost,
2967 tf_estimate,
2968 pitch_change,
2969 maxDepth,
2970 (*st).lfe,
2971 ((*st).energy_mask != NULL as *mut opus_val16) as i32,
2972 surround_masking,
2973 temporal_vbr,
2974 );
2975 } else {
2976 target = base_target;
2977 if (*st).silk_info.offset < 100 {
2978 target += (12) << BITRES >> 3 - LM;
2979 }
2980 if (*st).silk_info.offset > 100 {
2981 target -= (18) << BITRES >> 3 - LM;
2982 }
2983 target += ((tf_estimate - 0.25f32) * ((50) << 3) as f32) as i32;
2984 if tf_estimate > 0.7f32 {
2985 target = if target > (50) << 3 {
2986 target
2987 } else {
2988 (50) << 3
2989 };
2990 }
2991 }
2992 target = target + tell;
2993 min_allowed = (tell + total_boost + ((1) << BITRES + 3) - 1 >> BITRES + 3) + 2;
2994 if hybrid != 0 {
2995 min_allowed = if min_allowed
2996 > tell0_frac + ((37) << 3) + total_boost + ((1) << 3 + 3) - 1 >> 3 + 3
2997 {
2998 min_allowed
2999 } else {
3000 tell0_frac + ((37) << 3) + total_boost + ((1) << 3 + 3) - 1 >> 3 + 3
3001 };
3002 }
3003 nbAvailableBytes = target + ((1) << BITRES + 2) >> BITRES + 3;
3004 nbAvailableBytes = if min_allowed > nbAvailableBytes {
3005 min_allowed
3006 } else {
3007 nbAvailableBytes
3008 };
3009 nbAvailableBytes = if nbCompressedBytes < nbAvailableBytes {
3010 nbCompressedBytes
3011 } else {
3012 nbAvailableBytes
3013 };
3014 delta = target - vbr_rate;
3015 target = nbAvailableBytes << BITRES + 3;
3016 if silence != 0 {
3017 nbAvailableBytes = 2;
3018 target = (2 * 8) << BITRES;
3019 delta = 0;
3020 }
3021 if (*st).vbr_count < 970 {
3022 (*st).vbr_count += 1;
3023 alpha = 1.0f32 / ((*st).vbr_count + 20) as f32;
3024 } else {
3025 alpha = 0.001f32;
3026 }
3027 if (*st).constrained_vbr != 0 {
3028 (*st).vbr_reservoir += target - vbr_rate;
3029 }
3030 if (*st).constrained_vbr != 0 {
3031 (*st).vbr_drift += (alpha
3032 * (delta * ((1) << lm_diff) - (*st).vbr_offset - (*st).vbr_drift) as f32)
3033 as i32;
3034 (*st).vbr_offset = -(*st).vbr_drift;
3035 }
3036 if (*st).constrained_vbr != 0 && (*st).vbr_reservoir < 0 {
3037 let adjust: i32 = -(*st).vbr_reservoir / ((8) << BITRES);
3038 nbAvailableBytes += if silence != 0 { 0 } else { adjust };
3039 (*st).vbr_reservoir = 0;
3040 }
3041 nbCompressedBytes = if nbCompressedBytes < nbAvailableBytes {
3042 nbCompressedBytes
3043 } else {
3044 nbAvailableBytes
3045 };
3046 ec_enc_shrink(enc, nbCompressedBytes as u32);
3047 }
3048 let vla_12 = nbEBands as usize;
3049 let mut fine_quant: Vec<i32> = ::std::vec::from_elem(0, vla_12);
3050 let vla_13 = nbEBands as usize;
3051 let mut pulses: Vec<i32> = ::std::vec::from_elem(0, vla_13);
3052 let vla_14 = nbEBands as usize;
3053 let mut fine_priority: Vec<i32> = ::std::vec::from_elem(0, vla_14);
3054 bits = (((nbCompressedBytes * 8) << BITRES) as u32)
3055 .wrapping_sub(ec_tell_frac(enc))
3056 .wrapping_sub(1) as i32;
3057 anti_collapse_rsv = if isTransient != 0 && LM >= 2 && bits >= (LM + 2) << BITRES {
3058 (1) << BITRES
3059 } else {
3060 0
3061 };
3062 bits -= anti_collapse_rsv;
3063 signalBandwidth = end - 1;
3064 if (*st).analysis.valid != 0 {
3065 let mut min_bandwidth: i32 = 0;
3066 if equiv_rate < 32000 * C {
3067 min_bandwidth = 13;
3068 } else if equiv_rate < 48000 * C {
3069 min_bandwidth = 16;
3070 } else if equiv_rate < 60000 * C {
3071 min_bandwidth = 18;
3072 } else if equiv_rate < 80000 * C {
3073 min_bandwidth = 19;
3074 } else {
3075 min_bandwidth = 20;
3076 }
3077 signalBandwidth = if (*st).analysis.bandwidth > min_bandwidth {
3078 (*st).analysis.bandwidth
3079 } else {
3080 min_bandwidth
3081 };
3082 }
3083 if (*st).lfe != 0 {
3084 signalBandwidth = 1;
3085 }
3086 codedBands = clt_compute_allocation(
3087 mode,
3088 start,
3089 end,
3090 offsets.as_mut_ptr(),
3091 cap.as_mut_ptr(),
3092 alloc_trim,
3093 &mut (*st).intensity,
3094 &mut dual_stereo,
3095 bits,
3096 &mut balance,
3097 pulses.as_mut_ptr(),
3098 fine_quant.as_mut_ptr(),
3099 fine_priority.as_mut_ptr(),
3100 C,
3101 LM,
3102 enc,
3103 1,
3104 (*st).lastCodedBands,
3105 signalBandwidth,
3106 );
3107 if (*st).lastCodedBands != 0 {
3108 (*st).lastCodedBands = if ((*st).lastCodedBands + 1)
3109 < (if (*st).lastCodedBands - 1 > codedBands {
3110 (*st).lastCodedBands - 1
3111 } else {
3112 codedBands
3113 }) {
3114 (*st).lastCodedBands + 1
3115 } else if (*st).lastCodedBands - 1 > codedBands {
3116 (*st).lastCodedBands - 1
3117 } else {
3118 codedBands
3119 };
3120 } else {
3121 (*st).lastCodedBands = codedBands;
3122 }
3123 quant_fine_energy(
3124 mode,
3125 start,
3126 end,
3127 oldBandE,
3128 error.as_mut_ptr(),
3129 fine_quant.as_mut_ptr(),
3130 enc,
3131 C,
3132 );
3133 let vla_15 = (C * nbEBands) as usize;
3134 let mut collapse_masks: Vec<u8> = ::std::vec::from_elem(0, vla_15);
3135 quant_all_bands(
3136 1,
3137 mode,
3138 start,
3139 end,
3140 X.as_mut_ptr(),
3141 if C == 2 {
3142 X.as_mut_ptr().offset(N as isize)
3143 } else {
3144 NULL as *mut celt_norm
3145 },
3146 collapse_masks.as_mut_ptr(),
3147 bandE.as_mut_ptr(),
3148 pulses.as_mut_ptr(),
3149 shortBlocks,
3150 (*st).spread_decision,
3151 dual_stereo,
3152 (*st).intensity,
3153 tf_res.as_mut_ptr(),
3154 nbCompressedBytes * ((8) << BITRES) - anti_collapse_rsv,
3155 balance,
3156 enc,
3157 LM,
3158 codedBands,
3159 &mut (*st).rng,
3160 (*st).complexity,
3161 (*st).arch,
3162 (*st).disable_inv,
3163 );
3164 if anti_collapse_rsv > 0 {
3165 anti_collapse_on = ((*st).consec_transient < 2) as i32;
3166 ec_enc_bits(enc, anti_collapse_on as u32, 1);
3167 }
3168 quant_energy_finalise(
3169 mode,
3170 start,
3171 end,
3172 oldBandE,
3173 error.as_mut_ptr(),
3174 fine_quant.as_mut_ptr(),
3175 fine_priority.as_mut_ptr(),
3176 nbCompressedBytes * 8 - ec_tell(enc),
3177 enc,
3178 C,
3179 );
3180 memset(
3181 energyError as *mut core::ffi::c_void,
3182 0,
3183 ((nbEBands * CC) as u64).wrapping_mul(::core::mem::size_of::<opus_val16>() as u64),
3184 );
3185 c = 0;
3186 loop {
3187 i = start;
3188 while i < end {
3189 *energyError.offset((i + c * nbEBands) as isize) = if -0.5f32
3190 > (if 0.5f32 < *error.as_mut_ptr().offset((i + c * nbEBands) as isize) {
3191 0.5f32
3192 } else {
3193 *error.as_mut_ptr().offset((i + c * nbEBands) as isize)
3194 }) {
3195 -0.5f32
3196 } else if 0.5f32 < *error.as_mut_ptr().offset((i + c * nbEBands) as isize) {
3197 0.5f32
3198 } else {
3199 *error.as_mut_ptr().offset((i + c * nbEBands) as isize)
3200 };
3201 i += 1;
3202 }
3203 c += 1;
3204 if !(c < C) {
3205 break;
3206 }
3207 }
3208 if silence != 0 {
3209 i = 0;
3210 while i < C * nbEBands {
3211 *oldBandE.offset(i as isize) = -28.0f32;
3212 i += 1;
3213 }
3214 }
3215 (*st).prefilter_period = pitch_index;
3216 (*st).prefilter_gain = gain1;
3217 (*st).prefilter_tapset = prefilter_tapset;
3218 if CC == 2 && C == 1 {
3219 memcpy(
3220 &mut *oldBandE.offset(nbEBands as isize) as *mut opus_val16 as *mut core::ffi::c_void,
3221 oldBandE as *const core::ffi::c_void,
3222 (nbEBands as u64)
3223 .wrapping_mul(::core::mem::size_of::<opus_val16>() as u64)
3224 .wrapping_add(
3225 (0 * (&mut *oldBandE.offset(nbEBands as isize) as *mut opus_val16)
3226 .offset_from(oldBandE) as i64) as u64,
3227 ),
3228 );
3229 }
3230 if isTransient == 0 {
3231 memcpy(
3232 oldLogE2 as *mut core::ffi::c_void,
3233 oldLogE as *const core::ffi::c_void,
3234 ((CC * nbEBands) as u64)
3235 .wrapping_mul(::core::mem::size_of::<opus_val16>() as u64)
3236 .wrapping_add((0 * oldLogE2.offset_from(oldLogE) as i64) as u64),
3237 );
3238 memcpy(
3239 oldLogE as *mut core::ffi::c_void,
3240 oldBandE as *const core::ffi::c_void,
3241 ((CC * nbEBands) as u64)
3242 .wrapping_mul(::core::mem::size_of::<opus_val16>() as u64)
3243 .wrapping_add((0 * oldLogE.offset_from(oldBandE) as i64) as u64),
3244 );
3245 } else {
3246 i = 0;
3247 while i < CC * nbEBands {
3248 *oldLogE.offset(i as isize) =
3249 if *oldLogE.offset(i as isize) < *oldBandE.offset(i as isize) {
3250 *oldLogE.offset(i as isize)
3251 } else {
3252 *oldBandE.offset(i as isize)
3253 };
3254 i += 1;
3255 }
3256 }
3257 c = 0;
3258 loop {
3259 i = 0;
3260 while i < start {
3261 *oldBandE.offset((c * nbEBands + i) as isize) = 0 as opus_val16;
3262 let ref mut fresh5 = *oldLogE2.offset((c * nbEBands + i) as isize);
3263 *fresh5 = -28.0f32;
3264 *oldLogE.offset((c * nbEBands + i) as isize) = *fresh5;
3265 i += 1;
3266 }
3267 i = end;
3268 while i < nbEBands {
3269 *oldBandE.offset((c * nbEBands + i) as isize) = 0 as opus_val16;
3270 let ref mut fresh6 = *oldLogE2.offset((c * nbEBands + i) as isize);
3271 *fresh6 = -28.0f32;
3272 *oldLogE.offset((c * nbEBands + i) as isize) = *fresh6;
3273 i += 1;
3274 }
3275 c += 1;
3276 if !(c < CC) {
3277 break;
3278 }
3279 }
3280 if isTransient != 0 || transient_got_disabled != 0 {
3281 (*st).consec_transient += 1;
3282 } else {
3283 (*st).consec_transient = 0;
3284 }
3285 (*st).rng = (*enc).rng;
3286 ec_enc_done(enc);
3287 if ec_get_error(enc) != 0 {
3288 return OPUS_INTERNAL_ERROR;
3289 } else {
3290 return nbCompressedBytes;
3291 };
3292}
3293pub unsafe fn opus_custom_encoder_ctl_impl(
3294 st: *mut OpusCustomEncoder,
3295 request: i32,
3296 args: VarArgs,
3297) -> i32 {
3298 let current_block: u64;
3299 let mut ap = args;
3300 match request {
3301 OPUS_SET_COMPLEXITY_REQUEST => {
3302 let value: i32 = ap.arg::<i32>();
3303 if value < 0 || value > 10 {
3304 current_block = 2472048668343472511;
3305 } else {
3306 (*st).complexity = value;
3307 current_block = 10007731352114176167;
3308 }
3309 }
3310 CELT_SET_START_BAND_REQUEST => {
3311 let value_0: i32 = ap.arg::<i32>();
3312 if value_0 < 0 || value_0 >= (*(*st).mode).nbEBands {
3313 current_block = 2472048668343472511;
3314 } else {
3315 (*st).start = value_0;
3316 current_block = 10007731352114176167;
3317 }
3318 }
3319 CELT_SET_END_BAND_REQUEST => {
3320 let value_1: i32 = ap.arg::<i32>();
3321 if value_1 < 1 || value_1 > (*(*st).mode).nbEBands {
3322 current_block = 2472048668343472511;
3323 } else {
3324 (*st).end = value_1;
3325 current_block = 10007731352114176167;
3326 }
3327 }
3328 CELT_SET_PREDICTION_REQUEST => {
3329 let value_2: i32 = ap.arg::<i32>();
3330 if value_2 < 0 || value_2 > 2 {
3331 current_block = 2472048668343472511;
3332 } else {
3333 (*st).disable_pf = (value_2 <= 1) as i32;
3334 (*st).force_intra = (value_2 == 0) as i32;
3335 current_block = 10007731352114176167;
3336 }
3337 }
3338 OPUS_SET_PACKET_LOSS_PERC_REQUEST => {
3339 let value_3: i32 = ap.arg::<i32>();
3340 if value_3 < 0 || value_3 > 100 {
3341 current_block = 2472048668343472511;
3342 } else {
3343 (*st).loss_rate = value_3;
3344 current_block = 10007731352114176167;
3345 }
3346 }
3347 OPUS_SET_VBR_CONSTRAINT_REQUEST => {
3348 let value_4: i32 = ap.arg::<i32>();
3349 (*st).constrained_vbr = value_4;
3350 current_block = 10007731352114176167;
3351 }
3352 OPUS_SET_VBR_REQUEST => {
3353 let value_5: i32 = ap.arg::<i32>();
3354 (*st).vbr = value_5;
3355 current_block = 10007731352114176167;
3356 }
3357 OPUS_SET_BITRATE_REQUEST => {
3358 let mut value_6: i32 = ap.arg::<i32>();
3359 if value_6 <= 500 && value_6 != OPUS_BITRATE_MAX {
3360 current_block = 2472048668343472511;
3361 } else {
3362 value_6 = if value_6 < 260000 * (*st).channels {
3363 value_6
3364 } else {
3365 260000 * (*st).channels
3366 };
3367 (*st).bitrate = value_6;
3368 current_block = 10007731352114176167;
3369 }
3370 }
3371 CELT_SET_CHANNELS_REQUEST => {
3372 let value_7: i32 = ap.arg::<i32>();
3373 if value_7 < 1 || value_7 > 2 {
3374 current_block = 2472048668343472511;
3375 } else {
3376 (*st).stream_channels = value_7;
3377 current_block = 10007731352114176167;
3378 }
3379 }
3380 OPUS_SET_LSB_DEPTH_REQUEST => {
3381 let value_8: i32 = ap.arg::<i32>();
3382 if value_8 < 8 || value_8 > 24 {
3383 current_block = 2472048668343472511;
3384 } else {
3385 (*st).lsb_depth = value_8;
3386 current_block = 10007731352114176167;
3387 }
3388 }
3389 OPUS_GET_LSB_DEPTH_REQUEST => {
3390 let value_9: &mut i32 = ap.arg::<&mut i32>();
3391 *value_9 = (*st).lsb_depth;
3392 current_block = 10007731352114176167;
3393 }
3394 OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST => {
3395 let value_10: i32 = ap.arg::<i32>();
3396 if value_10 < 0 || value_10 > 1 {
3397 current_block = 2472048668343472511;
3398 } else {
3399 (*st).disable_inv = value_10;
3400 current_block = 10007731352114176167;
3401 }
3402 }
3403 OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST => {
3404 let value_11: &mut i32 = ap.arg::<&mut i32>();
3405 *value_11 = (*st).disable_inv;
3406 current_block = 10007731352114176167;
3407 }
3408 OPUS_RESET_STATE => {
3409 let mut i: i32 = 0;
3410 let mut oldBandE: *mut opus_val16 = 0 as *mut opus_val16;
3411 let mut oldLogE: *mut opus_val16 = 0 as *mut opus_val16;
3412 let mut oldLogE2: *mut opus_val16 = 0 as *mut opus_val16;
3413 oldBandE = ((*st).in_mem)
3414 .as_mut_ptr()
3415 .offset(((*st).channels * ((*(*st).mode).overlap + COMBFILTER_MAXPERIOD)) as isize)
3416 as *mut opus_val16;
3417 oldLogE = oldBandE.offset(((*st).channels * (*(*st).mode).nbEBands) as isize);
3418 oldLogE2 = oldLogE.offset(((*st).channels * (*(*st).mode).nbEBands) as isize);
3419 memset(
3420 &mut (*st).rng as *mut u32 as *mut i8 as *mut core::ffi::c_void,
3421 0,
3422 ((opus_custom_encoder_get_size((*st).mode, (*st).channels) as i64
3423 - (&mut (*st).rng as *mut u32 as *mut i8).offset_from(st as *mut i8) as i64)
3424 as u64)
3425 .wrapping_mul(::core::mem::size_of::<i8>() as u64),
3426 );
3427 i = 0;
3428 while i < (*st).channels * (*(*st).mode).nbEBands {
3429 let ref mut fresh7 = *oldLogE2.offset(i as isize);
3430 *fresh7 = -28.0f32;
3431 *oldLogE.offset(i as isize) = *fresh7;
3432 i += 1;
3433 }
3434 (*st).vbr_offset = 0;
3435 (*st).delayedIntra = 1 as opus_val32;
3436 (*st).spread_decision = SPREAD_NORMAL;
3437 (*st).tonal_average = 256;
3438 (*st).hf_average = 0;
3439 (*st).tapset_decision = 0;
3440 current_block = 10007731352114176167;
3441 }
3442 CELT_SET_SIGNALLING_REQUEST => {
3443 let value_12: i32 = ap.arg::<i32>();
3444 (*st).signalling = value_12;
3445 current_block = 10007731352114176167;
3446 }
3447 CELT_SET_ANALYSIS_REQUEST => {
3448 let info = ap.arg::<&mut AnalysisInfo>();
3449 memcpy(
3450 &mut (*st).analysis as *mut AnalysisInfo as *mut core::ffi::c_void,
3451 info as *mut AnalysisInfo as *const core::ffi::c_void,
3452 (1_u64)
3453 .wrapping_mul(::core::mem::size_of::<AnalysisInfo>() as u64)
3454 .wrapping_add(
3455 (0 * (&mut (*st).analysis as *mut AnalysisInfo).offset_from(info) as i64)
3456 as u64,
3457 ),
3458 );
3459 current_block = 10007731352114176167;
3460 }
3461 CELT_SET_SILK_INFO_REQUEST => {
3462 let info_0 = ap.arg::<&mut SILKInfo>();
3463 memcpy(
3464 &mut (*st).silk_info as *mut SILKInfo as *mut core::ffi::c_void,
3465 info_0 as *mut SILKInfo as *const core::ffi::c_void,
3466 (1_u64)
3467 .wrapping_mul(::core::mem::size_of::<SILKInfo>() as u64)
3468 .wrapping_add(
3469 (0 * (&mut (*st).silk_info as *mut SILKInfo).offset_from(info_0) as i64)
3470 as u64,
3471 ),
3472 );
3473 current_block = 10007731352114176167;
3474 }
3475 CELT_GET_MODE_REQUEST => {
3476 let value_13 = ap.arg::<&mut *const OpusCustomMode>();
3477 *value_13 = (*st).mode;
3478 current_block = 10007731352114176167;
3479 }
3480 OPUS_GET_FINAL_RANGE_REQUEST => {
3481 let value_14 = ap.arg::<&mut u32>();
3482 *value_14 = (*st).rng;
3483 current_block = 10007731352114176167;
3484 }
3485 OPUS_SET_LFE_REQUEST => {
3486 let value_15: i32 = ap.arg::<i32>();
3487 (*st).lfe = value_15;
3488 current_block = 10007731352114176167;
3489 }
3490 OPUS_SET_ENERGY_MASK_REQUEST => {
3491 let value_16: *mut opus_val16 = ap.arg::<*mut opus_val16>();
3492 (*st).energy_mask = value_16;
3493 current_block = 10007731352114176167;
3494 }
3495 _ => return OPUS_UNIMPLEMENTED,
3496 }
3497 match current_block {
3498 10007731352114176167 => return OPUS_OK,
3499 _ => return OPUS_BAD_ARG,
3500 };
3501}
3502#[macro_export]
3503macro_rules! opus_custom_encoder_ctl {
3504 ($st:expr, $request:expr, $($arg:expr),*) => {
3505 $crate::opus_custom_encoder_ctl_impl($st, $request, $crate::varargs!($($arg),*))
3506 };
3507 ($st:expr, $request:expr) => {
3508 opus_custom_encoder_ctl!($st, $request,)
3509 };
3510 ($st:expr, $request:expr, $($arg:expr),*,) => {
3511 opus_custom_encoder_ctl!($st, $request, $($arg),*)
3512 };
3513}