unsafe_libopus/celt/
celt_encoder.rs

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    // here, a 64-bit sqrt __should__ be used
332    .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}