Bug Summary

File:root/firefox-clang/media/libopus/celt/celt_decoder.c
Warning:line 403, column 25
The right operand of '*' is a garbage value

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -O2 -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name celt_decoder.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=all -relaxed-aliasing -ffp-contract=off -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/root/firefox-clang/obj-x86_64-pc-linux-gnu/media/libopus -fcoverage-compilation-dir=/root/firefox-clang/obj-x86_64-pc-linux-gnu/media/libopus -resource-dir /usr/lib/llvm-23/lib/clang/23 -include /root/firefox-clang/obj-x86_64-pc-linux-gnu/mozilla-config.h -U _FORTIFY_SOURCE -D _FORTIFY_SOURCE=2 -D DEBUG=1 -D OPUS_BUILD -D OPUS_VERSION=212d66c20944d0a0db91132f826a27dd0d5edd5d -D USE_ALLOCA -D ENABLE_HARDENING -D OPUS_EXPORT= -D ENABLE_ASSERTIONS -D HAVE_LRINTF -D OPUS_HAVE_RTCD -D CPU_INFO_BY_ASM -D OPUS_X86_MAY_HAVE_SSE -D OPUS_X86_MAY_HAVE_SSE2 -D OPUS_X86_MAY_HAVE_SSE4_1 -D OPUS_X86_MAY_HAVE_AVX -D MOZ_HAS_MOZGLUE -I /root/firefox-clang/media/libopus -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/media/libopus -I /root/firefox-clang/media/libopus/celt -I /root/firefox-clang/media/libopus/include -I /root/firefox-clang/media/libopus/silk -I /root/firefox-clang/media/libopus/silk/fixed -I /root/firefox-clang/media/libopus/silk/float -I /root/firefox-clang/media/libopus/src -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include/nspr -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include/nss -D MOZILLA_CLIENT -internal-isystem /usr/lib/llvm-23/lib/clang/23/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -Wno-error=tautological-type-limit-compare -Wno-range-loop-analysis -Wno-error=deprecated-declarations -Wno-error=array-bounds -Wno-error=free-nonheap-object -Wno-error=atomic-alignment -Wno-error=deprecated-builtins -Wno-psabi -Wno-error=builtin-macro-redefined -Wno-unknown-warning-option -Wno-character-conversion -Wno-#pragma-messages -ferror-limit 19 -fstrict-flex-arrays=1 -stack-protector 2 -fstack-clash-protection -ftrivial-auto-var-init=pattern -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fdiagnostics-absolute-paths -vectorize-loops -vectorize-slp -analyzer-checker optin.performance.Padding -analyzer-output=html -analyzer-config stable-report-filename=true -mllvm -dwarf-linkage-names=Abstract -faddrsig -fdwarf2-cfi-asm -o /tmp/scan-build-2026-09-01-224014-2642839-1 -x c /root/firefox-clang/media/libopus/celt/celt_decoder.c
1/* Copyright (c) 2007-2008 CSIRO
2 Copyright (c) 2007-2010 Xiph.Org Foundation
3 Copyright (c) 2008 Gregory Maxwell
4 Written by Jean-Marc Valin and Gregory Maxwell */
5/*
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions
8 are met:
9
10 - Redistributions of source code must retain the above copyright
11 notice, this list of conditions and the following disclaimer.
12
13 - Redistributions in binary form must reproduce the above copyright
14 notice, this list of conditions and the following disclaimer in the
15 documentation and/or other materials provided with the distribution.
16
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*/
29
30#ifdef HAVE_CONFIG_H
31#include "config.h"
32#endif
33
34#define CELT_DECODER_C
35
36#include "cpu_support.h"
37#include "os_support.h"
38#include "mdct.h"
39#include <math.h>
40#include "celt.h"
41#include "pitch.h"
42#include "bands.h"
43#include "modes.h"
44#include "entcode.h"
45#include "quant_bands.h"
46#include "rate.h"
47#include "stack_alloc.h"
48#include "mathops.h"
49#include "float_cast.h"
50#include <stdarg.h>
51#include "celt_lpc.h"
52#include "vq.h"
53
54#ifdef ENABLE_DEEP_PLC
55#include "lpcnet.h"
56#include "lpcnet_private.h"
57#endif
58
59/* The maximum pitch lag to allow in the pitch-based PLC. It's possible to save
60 CPU time in the PLC pitch search by making this smaller than MAX_PERIOD. The
61 current value corresponds to a pitch of 66.67 Hz. */
62#define PLC_PITCH_LAG_MAX(720) (720)
63/* The minimum pitch lag to allow in the pitch-based PLC. This corresponds to a
64 pitch of 480 Hz. */
65#define PLC_PITCH_LAG_MIN(100) (100)
66
67#define FRAME_NONE0 0
68#define FRAME_NORMAL1 1
69#define FRAME_PLC_NOISE2 2
70#define FRAME_PLC_PERIODIC3 3
71#define FRAME_PLC_NEURAL4 4
72#define FRAME_DRED5 5
73
74/**********************************************************************/
75/* */
76/* DECODER */
77/* */
78/**********************************************************************/
79#define DECODE_BUFFER_SIZE2048 DEC_PITCH_BUF_SIZE2048
80
81#define PLC_UPDATE_FRAMES4 4
82#define PLC_UPDATE_SAMPLES(4*FRAME_SIZE) (PLC_UPDATE_FRAMES4*FRAME_SIZE)
83
84/** Decoder state
85 @brief Decoder state
86 */
87struct OpusCustomDecoder {
88 const OpusCustomMode *mode;
89 int overlap;
90 int channels;
91 int stream_channels;
92
93 int downsample;
94 int start, end;
95 int signalling;
96 int disable_inv;
97 int complexity;
98 int arch;
99#ifdef ENABLE_QEXT
100 int qext_scale;
101#endif
102
103 /* Everything beyond this point gets cleared on a reset */
104#define DECODER_RESET_STARTrng rng
105
106 opus_uint32 rng;
107 int error;
108 int last_pitch_index;
109 int loss_duration;
110 int plc_duration;
111 int last_frame_type;
112 int skip_plc;
113 int postfilter_period;
114 int postfilter_period_old;
115 opus_val16 postfilter_gain;
116 opus_val16 postfilter_gain_old;
117 int postfilter_tapset;
118 int postfilter_tapset_old;
119 int prefilter_and_fold;
120
121 celt_sig preemph_memD[2];
122
123#ifdef ENABLE_DEEP_PLC
124 opus_int16 plc_pcm[PLC_UPDATE_SAMPLES(4*FRAME_SIZE)];
125 int plc_fill;
126 float plc_preemphasis_mem;
127#endif
128
129#ifdef ENABLE_QEXT
130 celt_glog qext_oldBandE[2*NB_QEXT_BANDS];
131#endif
132
133 celt_sig _decode_mem[1]; /* Size = channels*(DECODE_BUFFER_SIZE+mode->overlap) */
134 /* celt_glog oldEBands[], Size = 2*mode->nbEBands */
135 /* celt_glog oldLogE[], Size = 2*mode->nbEBands */
136 /* celt_glog oldLogE2[], Size = 2*mode->nbEBands */
137 /* celt_glog backgroundLogE[], Size = 2*mode->nbEBands */
138 /* opus_val16 lpc[], Size = channels*CELT_LPC_ORDER */
139};
140
141#if defined(ENABLE_HARDENING1) || defined(ENABLE_ASSERTIONS1)
142/* Make basic checks on the CELT state to ensure we don't end
143 up writing all over memory. */
144void validate_celt_decoder(CELTDecoderOpusCustomDecoder *st)
145{
146#if !defined(CUSTOM_MODES) && !defined(ENABLE_OPUS_CUSTOM_API) && !defined(ENABLE_QEXT)
147 celt_assert(st->mode == opus_custom_mode_create(48000, 960, NULL)){if (!(st->mode == opus_custom_mode_create(48000, 960, ((void
*)0)))) {celt_fatal("assertion failed: " "st->mode == opus_custom_mode_create(48000, 960, NULL)"
, "/root/firefox-clang/media/libopus/celt/celt_decoder.c", 147
);}}
;
148 celt_assert(st->overlap == 120){if (!(st->overlap == 120)) {celt_fatal("assertion failed: "
"st->overlap == 120", "/root/firefox-clang/media/libopus/celt/celt_decoder.c"
, 148);}}
;
149 celt_assert(st->end <= 21){if (!(st->end <= 21)) {celt_fatal("assertion failed: "
"st->end <= 21", "/root/firefox-clang/media/libopus/celt/celt_decoder.c"
, 149);}}
;
150#else
151/* From Section 4.3 in the spec: "The normal CELT layer uses 21 of those bands,
152 though Opus Custom (see Section 6.2) may use a different number of bands"
153
154 Check if it's within the maximum number of Bark frequency bands instead */
155 celt_assert(st->end <= 25){if (!(st->end <= 25)) {celt_fatal("assertion failed: "
"st->end <= 25", "/root/firefox-clang/media/libopus/celt/celt_decoder.c"
, 155);}}
;
156#endif
157 celt_assert(st->channels == 1 || st->channels == 2){if (!(st->channels == 1 || st->channels == 2)) {celt_fatal
("assertion failed: " "st->channels == 1 || st->channels == 2"
, "/root/firefox-clang/media/libopus/celt/celt_decoder.c", 157
);}}
;
158 celt_assert(st->stream_channels == 1 || st->stream_channels == 2){if (!(st->stream_channels == 1 || st->stream_channels ==
2)) {celt_fatal("assertion failed: " "st->stream_channels == 1 || st->stream_channels == 2"
, "/root/firefox-clang/media/libopus/celt/celt_decoder.c", 158
);}}
;
159 celt_assert(st->downsample > 0){if (!(st->downsample > 0)) {celt_fatal("assertion failed: "
"st->downsample > 0", "/root/firefox-clang/media/libopus/celt/celt_decoder.c"
, 159);}}
;
160 celt_assert(st->start == 0 || st->start == 17){if (!(st->start == 0 || st->start == 17)) {celt_fatal(
"assertion failed: " "st->start == 0 || st->start == 17"
, "/root/firefox-clang/media/libopus/celt/celt_decoder.c", 160
);}}
;
161 celt_assert(st->start < st->end){if (!(st->start < st->end)) {celt_fatal("assertion failed: "
"st->start < st->end", "/root/firefox-clang/media/libopus/celt/celt_decoder.c"
, 161);}}
;
162#ifdef OPUS_ARCHMASK7
163 celt_assert(st->arch >= 0){if (!(st->arch >= 0)) {celt_fatal("assertion failed: "
"st->arch >= 0", "/root/firefox-clang/media/libopus/celt/celt_decoder.c"
, 163);}}
;
164 celt_assert(st->arch <= OPUS_ARCHMASK){if (!(st->arch <= 7)) {celt_fatal("assertion failed: "
"st->arch <= OPUS_ARCHMASK", "/root/firefox-clang/media/libopus/celt/celt_decoder.c"
, 164);}}
;
165#endif
166#ifndef ENABLE_QEXT
167 celt_assert(st->last_pitch_index <= PLC_PITCH_LAG_MAX){if (!(st->last_pitch_index <= (720))) {celt_fatal("assertion failed: "
"st->last_pitch_index <= PLC_PITCH_LAG_MAX", "/root/firefox-clang/media/libopus/celt/celt_decoder.c"
, 167);}}
;
168 celt_assert(st->last_pitch_index >= PLC_PITCH_LAG_MIN || st->last_pitch_index == 0){if (!(st->last_pitch_index >= (100) || st->last_pitch_index
== 0)) {celt_fatal("assertion failed: " "st->last_pitch_index >= PLC_PITCH_LAG_MIN || st->last_pitch_index == 0"
, "/root/firefox-clang/media/libopus/celt/celt_decoder.c", 168
);}}
;
169#endif
170 celt_assert(st->postfilter_period < MAX_PERIOD){if (!(st->postfilter_period < 1024)) {celt_fatal("assertion failed: "
"st->postfilter_period < MAX_PERIOD", "/root/firefox-clang/media/libopus/celt/celt_decoder.c"
, 170);}}
;
171 celt_assert(st->postfilter_period >= COMBFILTER_MINPERIOD || st->postfilter_period == 0){if (!(st->postfilter_period >= 15 || st->postfilter_period
== 0)) {celt_fatal("assertion failed: " "st->postfilter_period >= COMBFILTER_MINPERIOD || st->postfilter_period == 0"
, "/root/firefox-clang/media/libopus/celt/celt_decoder.c", 171
);}}
;
172 celt_assert(st->postfilter_period_old < MAX_PERIOD){if (!(st->postfilter_period_old < 1024)) {celt_fatal("assertion failed: "
"st->postfilter_period_old < MAX_PERIOD", "/root/firefox-clang/media/libopus/celt/celt_decoder.c"
, 172);}}
;
173 celt_assert(st->postfilter_period_old >= COMBFILTER_MINPERIOD || st->postfilter_period_old == 0){if (!(st->postfilter_period_old >= 15 || st->postfilter_period_old
== 0)) {celt_fatal("assertion failed: " "st->postfilter_period_old >= COMBFILTER_MINPERIOD || st->postfilter_period_old == 0"
, "/root/firefox-clang/media/libopus/celt/celt_decoder.c", 173
);}}
;
174 celt_assert(st->postfilter_tapset <= 2){if (!(st->postfilter_tapset <= 2)) {celt_fatal("assertion failed: "
"st->postfilter_tapset <= 2", "/root/firefox-clang/media/libopus/celt/celt_decoder.c"
, 174);}}
;
175 celt_assert(st->postfilter_tapset >= 0){if (!(st->postfilter_tapset >= 0)) {celt_fatal("assertion failed: "
"st->postfilter_tapset >= 0", "/root/firefox-clang/media/libopus/celt/celt_decoder.c"
, 175);}}
;
176 celt_assert(st->postfilter_tapset_old <= 2){if (!(st->postfilter_tapset_old <= 2)) {celt_fatal("assertion failed: "
"st->postfilter_tapset_old <= 2", "/root/firefox-clang/media/libopus/celt/celt_decoder.c"
, 176);}}
;
177 celt_assert(st->postfilter_tapset_old >= 0){if (!(st->postfilter_tapset_old >= 0)) {celt_fatal("assertion failed: "
"st->postfilter_tapset_old >= 0", "/root/firefox-clang/media/libopus/celt/celt_decoder.c"
, 177);}}
;
178}
179#endif
180
181int celt_decoder_get_size(int channels)
182{
183#ifdef ENABLE_QEXT
184 const CELTModeOpusCustomMode *mode = opus_custom_mode_create(96000, 960, NULL((void*)0));
185#else
186 const CELTModeOpusCustomMode *mode = opus_custom_mode_create(48000, 960, NULL((void*)0));
187#endif
188 return opus_custom_decoder_get_size(mode, channels);
189}
190
191OPUS_CUSTOM_NOSTATICstatic inline int opus_custom_decoder_get_size(const CELTModeOpusCustomMode *mode, int channels)
192{
193 int size;
194#ifdef ENABLE_QEXT
195 int qext_scale;
196 if (mode->Fs == 96000 && (mode->shortMdctSize==240 || mode->shortMdctSize==180)) {
197 qext_scale = 2;
198 } else qext_scale = 1;
199#endif
200 size = sizeof(struct CELTDecoderOpusCustomDecoder)
201 + (channels*(QEXT_SCALE(DECODE_BUFFER_SIZE)(2048)+mode->overlap)-1)*sizeof(celt_sig)
202 + 4*2*mode->nbEBands*sizeof(celt_glog)
203 + channels*CELT_LPC_ORDER24*sizeof(opus_val16);
204 return size;
205}
206
207#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API)
208CELTDecoderOpusCustomDecoder *opus_custom_decoder_create(const CELTModeOpusCustomMode *mode, int channels, int *error)
209{
210 int ret;
211 CELTDecoderOpusCustomDecoder *st = (CELTDecoderOpusCustomDecoder *)opus_alloc(opus_custom_decoder_get_size(mode, channels));
212 ret = opus_custom_decoder_init(st, mode, channels);
213 if (ret != OPUS_OK0)
214 {
215 opus_custom_decoder_destroy(st);
216 st = NULL((void*)0);
217 }
218 if (error)
219 *error = ret;
220 return st;
221}
222#endif /* CUSTOM_MODES */
223
224int celt_decoder_init(CELTDecoderOpusCustomDecoder *st, opus_int32 sampling_rate, int channels)
225{
226 int ret;
227#ifdef ENABLE_QEXT
228 if (sampling_rate == 96000) {
229 return opus_custom_decoder_init(st, opus_custom_mode_create(96000, 960, NULL((void*)0)), channels);
230 }
231#endif
232 ret = opus_custom_decoder_init(st, opus_custom_mode_create(48000, 960, NULL((void*)0)), channels);
233 if (ret != OPUS_OK0)
234 return ret;
235 st->downsample = resampling_factor(sampling_rate);
236 if (st->downsample==0)
237 return OPUS_BAD_ARG-1;
238 else
239 return OPUS_OK0;
240}
241
242OPUS_CUSTOM_NOSTATICstatic inline int opus_custom_decoder_init(CELTDecoderOpusCustomDecoder *st, const CELTModeOpusCustomMode *mode, int channels)
243{
244 if (channels < 0 || channels > 2)
245 return OPUS_BAD_ARG-1;
246
247 if (st==NULL((void*)0))
248 return OPUS_ALLOC_FAIL-7;
249
250 OPUS_CLEAR((char*)st, opus_custom_decoder_get_size(mode, channels))(memset(((char*)st), 0, (opus_custom_decoder_get_size(mode, channels
))*sizeof(*((char*)st))))
;
251
252 st->mode = mode;
253 st->overlap = mode->overlap;
254 st->stream_channels = st->channels = channels;
255
256 st->downsample = 1;
257 st->start = 0;
258 st->end = st->mode->effEBands;
259 st->signalling = 1;
260#ifndef DISABLE_UPDATE_DRAFT
261 st->disable_inv = channels == 1;
262#else
263 st->disable_inv = 0;
264#endif
265 st->arch = opus_select_arch();
266
267#ifdef ENABLE_QEXT
268 if (st->mode->Fs == 96000 && (mode->shortMdctSize==240 || mode->shortMdctSize==180)) st->qext_scale = 2;
269 else st->qext_scale = 1;
270#endif
271
272 opus_custom_decoder_ctl(st, OPUS_RESET_STATE4028);
273
274 return OPUS_OK0;
275}
276
277#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API)
278void opus_custom_decoder_destroy(CELTDecoderOpusCustomDecoder *st)
279{
280 opus_free(st);
281}
282#endif /* CUSTOM_MODES */
283
284#if !defined(CUSTOM_MODES) && !defined(ENABLE_OPUS_CUSTOM_API) && !defined(ENABLE_QEXT)
285/* Special case for stereo with no downsampling and no accumulation. This is
286 quite common and we can make it faster by processing both channels in the
287 same loop, reducing overhead due to the dependency loop in the IIR filter. */
288static void deemphasis_stereo_simple(celt_sig *in[], opus_res *pcm, int N, const opus_val16 coef0,
289 celt_sig *mem)
290{
291 celt_sig * OPUS_RESTRICTrestrict x0;
292 celt_sig * OPUS_RESTRICTrestrict x1;
293 celt_sig m0, m1;
294 int j;
295 x0=in[0];
296 x1=in[1];
297 m0 = mem[0];
298 m1 = mem[1];
299 for (j=0;j<N;j++)
300 {
301 celt_sig tmp0, tmp1;
302 /* Add VERY_SMALL to x[] first to reduce dependency chain. */
303 tmp0 = SATURATE(x0[j] + VERY_SMALL + m0, SIG_SAT)(x0[j] + 1e-30f + m0);
304 tmp1 = SATURATE(x1[j] + VERY_SMALL + m1, SIG_SAT)(x1[j] + 1e-30f + m1);
305 m0 = MULT16_32_Q15(coef0, tmp0)((coef0)*(tmp0));
306 m1 = MULT16_32_Q15(coef0, tmp1)((coef0)*(tmp1));
307 pcm[2*j ] = SIG2RES(tmp0)((1/32768.f)*(tmp0));
308 pcm[2*j+1] = SIG2RES(tmp1)((1/32768.f)*(tmp1));
309 }
310 mem[0] = m0;
311 mem[1] = m1;
312}
313#endif
314
315#ifndef RESYNTH
316static
317#endif
318void deemphasis(celt_sig *in[], opus_res *pcm, int N, int C, int downsample, const opus_val16 *coef,
319 celt_sig *mem, int accum)
320{
321 int c;
322 int Nd;
323 int apply_downsampling=0;
324 opus_val16 coef0;
325 VARDECL(celt_sig, scratch)celt_sig *scratch;
326 SAVE_STACK;
327#if !defined(CUSTOM_MODES) && !defined(ENABLE_OPUS_CUSTOM_API) && !defined(ENABLE_QEXT)
328 /* Short version for common case. */
329 if (downsample == 1 && C == 2 && !accum)
16
Assuming 'downsample' is not equal to 1
330 {
331 deemphasis_stereo_simple(in, pcm, N, coef[0], mem);
332 return;
333 }
334#endif
335 ALLOC(scratch, N, celt_sig)scratch = ((celt_sig*)__builtin_alloca (sizeof(celt_sig)*(N))
)
;
336 coef0 = coef[0];
337 Nd = N/downsample;
338 c=0; do {
339 int j;
340 celt_sig * OPUS_RESTRICTrestrict x;
341 opus_res * OPUS_RESTRICTrestrict y;
342 celt_sig m = mem[c];
343 x =in[c];
344 y = pcm+c;
345#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API) || defined(ENABLE_QEXT)
346 if (coef[1] != 0)
347 {
348 opus_val16 coef1 = coef[1];
349 opus_val16 coef3 = coef[3];
350 for (j=0;j<N;j++)
351 {
352 celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT)(x[j] + m + 1e-30f);
353 m = MULT16_32_Q15(coef0, tmp)((coef0)*(tmp))
354 - MULT16_32_Q15(coef1, x[j])((coef1)*(x[j]));
355 tmp = SHL32(MULT16_32_Q15(coef3, tmp), 2)(((coef3)*(tmp)));
356 scratch[j] = tmp;
357 }
358 apply_downsampling=1;
359 } else
360#endif
361 if (downsample>1)
17
Assuming 'downsample' is > 1
18
Taking true branch
362 {
363 /* Shortcut for the standard (non-custom modes) case */
364 for (j=0;j<N;j++)
19
Assuming 'j' is >= 'N'
20
Loop condition is false. Execution continues on line 370
365 {
366 celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT)(x[j] + 1e-30f + m);
367 m = MULT16_32_Q15(coef0, tmp)((coef0)*(tmp));
368 scratch[j] = tmp;
369 }
370 apply_downsampling=1;
371 } else {
372 /* Shortcut for the standard (non-custom modes) case */
373 if (accum)
374 {
375 for (j=0;j<N;j++)
376 {
377 celt_sig tmp = SATURATE(x[j] + m + VERY_SMALL, SIG_SAT)(x[j] + m + 1e-30f);
378 m = MULT16_32_Q15(coef0, tmp)((coef0)*(tmp));
379 y[j*C] = ADD_RES(y[j*C], SIG2RES(tmp))((y[j*C])+(((1/32768.f)*(tmp))));
380 }
381 } else
382 {
383 for (j=0;j<N;j++)
384 {
385 celt_sig tmp = SATURATE(x[j] + VERY_SMALL + m, SIG_SAT)(x[j] + 1e-30f + m);
386 m = MULT16_32_Q15(coef0, tmp)((coef0)*(tmp));
387 y[j*C] = SIG2RES(tmp)((1/32768.f)*(tmp));
388 }
389 }
390 }
391 mem[c] = m;
392
393 if (apply_downsampling
20.1
'apply_downsampling' is 1
)
21
Taking true branch
394 {
395 /* Perform down-sampling */
396 if (accum)
22
Assuming 'accum' is 0
23
Taking false branch
397 {
398 for (j=0;j<Nd;j++)
399 y[j*C] = ADD_RES(y[j*C], SIG2RES(scratch[j*downsample]))((y[j*C])+(((1/32768.f)*(scratch[j*downsample]))));
400 } else
401 {
402 for (j=0;j<Nd;j++)
24
The value 0 is assigned to 'j'
25
Assuming 'j' is < 'Nd'
26
Loop condition is true. Entering loop body
403 y[j*C] = SIG2RES(scratch[j*downsample])((1/32768.f)*(scratch[j*downsample]));
27
The right operand of '*' is a garbage value
404 }
405 }
406 } while (++c<C);
407 RESTORE_STACK;
408}
409
410#ifndef RESYNTH
411static
412#endif
413void celt_synthesis(const CELTModeOpusCustomMode *mode, celt_norm *X, celt_sig * out_syn[],
414 celt_glog *oldBandE, int start, int effEnd, int C, int CC,
415 int isTransient, int LM, int downsample,
416 int silence, int arch ARG_QEXT(const CELTMode *qext_mode) ARG_QEXT(const celt_glog *qext_bandLogE) ARG_QEXT(int qext_end))
417{
418 int c, i;
419 int M;
420 int b;
421 int B;
422 int N, NB;
423 int shift;
424 int nbEBands;
425 int overlap;
426 VARDECL(celt_sig, freq)celt_sig *freq;
427 SAVE_STACK;
428
429 overlap = mode->overlap;
430 nbEBands = mode->nbEBands;
431 N = mode->shortMdctSize<<LM;
432 ALLOC(freq, N, celt_sig)freq = ((celt_sig*)__builtin_alloca (sizeof(celt_sig)*(N))); /**< Interleaved signal MDCTs */
433 M = 1<<LM;
434#ifdef ENABLE_QEXT
435 if (mode->Fs != 96000) qext_end=2;
436#endif
437
438 if (isTransient)
439 {
440 B = M;
441 NB = mode->shortMdctSize;
442 shift = mode->maxLM;
443 } else {
444 B = 1;
445 NB = mode->shortMdctSize<<LM;
446 shift = mode->maxLM-LM;
447 }
448
449 if (CC==2&&C==1)
450 {
451 /* Copying a mono streams to two channels */
452 celt_sig *freq2;
453 denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M,
454 downsample, silence);
455#ifdef ENABLE_QEXT
456 if (qext_mode)
457 denormalise_bands(qext_mode, X, freq, qext_bandLogE, 0, qext_end, M,
458 downsample, silence);
459#endif
460 /* Store a temporary copy in the output buffer because the IMDCT destroys its input. */
461 freq2 = out_syn[1]+overlap/2;
462 OPUS_COPY(freq2, freq, N)(memcpy((freq2), (freq), (N)*sizeof(*(freq2)) + 0*((freq2)-(freq
)) ))
;
463 for (b=0;b<B;b++)
464 clt_mdct_backward(&mode->mdct, &freq2[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch)clt_mdct_backward_c(&mode->mdct, &freq2[b], out_syn
[0]+NB*b, mode->window, overlap, shift, B, arch)
;
465 for (b=0;b<B;b++)
466 clt_mdct_backward(&mode->mdct, &freq[b], out_syn[1]+NB*b, mode->window, overlap, shift, B, arch)clt_mdct_backward_c(&mode->mdct, &freq[b], out_syn
[1]+NB*b, mode->window, overlap, shift, B, arch)
;
467 } else if (CC==1&&C==2)
468 {
469 /* Downmixing a stereo stream to mono */
470 celt_sig *freq2;
471 freq2 = out_syn[0]+overlap/2;
472 denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M,
473 downsample, silence);
474 /* Use the output buffer as temp array before downmixing. */
475 denormalise_bands(mode, X+N, freq2, oldBandE+nbEBands, start, effEnd, M,
476 downsample, silence);
477#ifdef ENABLE_QEXT
478 if (qext_mode)
479 {
480 denormalise_bands(qext_mode, X, freq, qext_bandLogE, 0, qext_end, M,
481 downsample, silence);
482 denormalise_bands(qext_mode, X+N, freq2, qext_bandLogE+NB_QEXT_BANDS, 0, qext_end, M,
483 downsample, silence);
484 }
485#endif
486 for (i=0;i<N;i++)
487 freq[i] = ADD32(HALF32(freq[i]), HALF32(freq2[i]))(((.5f*(freq[i])))+((.5f*(freq2[i]))));
488 for (b=0;b<B;b++)
489 clt_mdct_backward(&mode->mdct, &freq[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch)clt_mdct_backward_c(&mode->mdct, &freq[b], out_syn
[0]+NB*b, mode->window, overlap, shift, B, arch)
;
490 } else {
491 /* Normal case (mono or stereo) */
492 c=0; do {
493 denormalise_bands(mode, X+c*N, freq, oldBandE+c*nbEBands, start, effEnd, M,
494 downsample, silence);
495#ifdef ENABLE_QEXT
496 if (qext_mode)
497 denormalise_bands(qext_mode, X+c*N, freq, qext_bandLogE+c*NB_QEXT_BANDS, 0, qext_end, M,
498 downsample, silence);
499#endif
500 for (b=0;b<B;b++)
501 clt_mdct_backward(&mode->mdct, &freq[b], out_syn[c]+NB*b, mode->window, overlap, shift, B, arch)clt_mdct_backward_c(&mode->mdct, &freq[b], out_syn
[c]+NB*b, mode->window, overlap, shift, B, arch)
;
502 } while (++c<CC);
503 }
504 /* Saturate IMDCT output so that we can't overflow in the pitch postfilter
505 or in the */
506 c=0; do {
507 for (i=0;i<N;i++)
508 out_syn[c][i] = SATURATE(out_syn[c][i], SIG_SAT)(out_syn[c][i]);
509 } while (++c<CC);
510 RESTORE_STACK;
511}
512
513static void tf_decode(int start, int end, int isTransient, int *tf_res, int LM, ec_dec *dec)
514{
515 int i, curr, tf_select;
516 int tf_select_rsv;
517 int tf_changed;
518 int logp;
519 opus_uint32 budget;
520 opus_uint32 tell;
521
522 budget = dec->storage*8;
523 tell = ec_tell(dec);
524 logp = isTransient ? 2 : 4;
525 tf_select_rsv = LM>0 && tell+logp+1<=budget;
526 budget -= tf_select_rsv;
527 tf_changed = curr = 0;
528 for (i=start;i<end;i++)
529 {
530 if (tell+logp<=budget)
531 {
532 curr ^= ec_dec_bit_logp(dec, logp);
533 tell = ec_tell(dec);
534 tf_changed |= curr;
535 }
536 tf_res[i] = curr;
537 logp = isTransient ? 4 : 5;
538 }
539 tf_select = 0;
540 if (tf_select_rsv &&
541 tf_select_table[LM][4*isTransient+0+tf_changed] !=
542 tf_select_table[LM][4*isTransient+2+tf_changed])
543 {
544 tf_select = ec_dec_bit_logp(dec, 1);
545 }
546 for (i=start;i<end;i++)
547 {
548 tf_res[i] = tf_select_table[LM][4*isTransient+2*tf_select+tf_res[i]];
549 }
550}
551
552static int celt_plc_pitch_search(CELTDecoderOpusCustomDecoder *st, celt_sig *decode_mem[2], int C, int arch)
553{
554 int pitch_index;
555#ifdef ENABLE_QEXT
556 int qext_scale;
557#endif
558 VARDECL( opus_val16, lp_pitch_buf )opus_val16 *lp_pitch_buf;
559 SAVE_STACK;
560#ifdef ENABLE_QEXT
561 qext_scale = st->qext_scale;
562#else
563 (void)st;
564#endif
565 ALLOC( lp_pitch_buf, DECODE_BUFFER_SIZE>>1, opus_val16 )lp_pitch_buf = ((opus_val16*)__builtin_alloca (sizeof(opus_val16
)*(2048>>1)))
;
566 pitch_downsample(decode_mem, lp_pitch_buf,
567 DECODE_BUFFER_SIZE2048>>1, C, QEXT_SCALE(2)(2), arch);
568 pitch_search(lp_pitch_buf+(PLC_PITCH_LAG_MAX(720)>>1), lp_pitch_buf,
569 DECODE_BUFFER_SIZE2048-PLC_PITCH_LAG_MAX(720),
570 PLC_PITCH_LAG_MAX(720)-PLC_PITCH_LAG_MIN(100), &pitch_index, arch);
571 pitch_index = PLC_PITCH_LAG_MAX(720)-pitch_index;
572 RESTORE_STACK;
573 return QEXT_SCALE(pitch_index)(pitch_index);
574}
575
576static void prefilter_and_fold(CELTDecoderOpusCustomDecoder * OPUS_RESTRICTrestrict st, int N)
577{
578 int c;
579 int CC;
580 int i;
581 int overlap;
582 celt_sig *decode_mem[2];
583 const OpusCustomMode *mode;
584 int decode_buffer_size;
585#ifdef ENABLE_QEXT
586 int qext_scale;
587#endif
588 VARDECL(opus_val32, etmp)opus_val32 *etmp;
589 SAVE_STACK
590#ifdef ENABLE_QEXT
591 qext_scale = st->qext_scale;
592#endif
593 decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE)(2048);
594 mode = st->mode;
595 overlap = st->overlap;
596 CC = st->channels;
597 ALLOC(etmp, overlap, opus_val32)etmp = ((opus_val32*)__builtin_alloca (sizeof(opus_val32)*(overlap
)))
;
598 c=0; do {
599 decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
600 } while (++c<CC);
601
602 c=0; do {
603 /* Apply the pre-filter to the MDCT overlap for the next frame because
604 the post-filter will be re-applied in the decoder after the MDCT
605 overlap. */
606 comb_filter(etmp, decode_mem[c]+decode_buffer_size-N,
607 st->postfilter_period_old, st->postfilter_period, overlap,
608 -st->postfilter_gain_old, -st->postfilter_gain,
609 st->postfilter_tapset_old, st->postfilter_tapset, NULL((void*)0), 0, st->arch);
610
611 /* Simulate TDAC on the concealed audio so that it blends with the
612 MDCT of the next frame. */
613 for (i=0;i<overlap/2;i++)
614 {
615 decode_mem[c][decode_buffer_size-N+i] =
616 MULT16_32_Q15(COEF2VAL16(mode->window[i]), etmp[overlap-1-i])(((mode->window[i]))*(etmp[overlap-1-i]))
617 + MULT16_32_Q15 (COEF2VAL16(mode->window[overlap-i-1]), etmp[i])(((mode->window[overlap-i-1]))*(etmp[i]));
618 }
619 } while (++c<CC);
620 RESTORE_STACK;
621}
622
623#ifdef ENABLE_DEEP_PLC
624
625#define SINC_ORDER 48
626/* h=cos(pi/2*abs(sin([-24:24]/48*pi*23./24)).^2);
627 b=sinc([-24:24]/3*1.02).*h;
628 b=b/sum(b); */
629static const float sinc_filter[SINC_ORDER+1] = {
630 4.2931e-05f, -0.000190293f, -0.000816132f, -0.000637162f, 0.00141662f, 0.00354764f, 0.00184368f, -0.00428274f,
631 -0.00856105f, -0.0034003f, 0.00930201f, 0.0159616f, 0.00489785f, -0.0169649f, -0.0259484f, -0.00596856f,
632 0.0286551f, 0.0405872f, 0.00649994f, -0.0509284f, -0.0716655f, -0.00665212f, 0.134336f, 0.278927f,
633 0.339995f, 0.278927f, 0.134336f, -0.00665212f, -0.0716655f, -0.0509284f, 0.00649994f, 0.0405872f,
634 0.0286551f, -0.00596856f, -0.0259484f, -0.0169649f, 0.00489785f, 0.0159616f, 0.00930201f, -0.0034003f,
635 -0.00856105f, -0.00428274f, 0.00184368f, 0.00354764f, 0.00141662f, -0.000637162f, -0.000816132f, -0.000190293f,
636 4.2931e-05f
637};
638
639void update_plc_state(LPCNetPLCState *lpcnet, celt_sig *decode_mem[2], float *plc_preemphasis_mem, int CC)
640{
641 int i;
642 int tmp_read_post, tmp_fec_skip;
643 int offset;
644 VARDECL(celt_sig, buf48k)celt_sig *buf48k;
645 VARDECL(opus_int16, buf16k)opus_int16 *buf16k;
646 SAVE_STACK;
647 ALLOC(buf48k, DECODE_BUFFER_SIZE, celt_sig)buf48k = ((celt_sig*)__builtin_alloca (sizeof(celt_sig)*(2048
)))
;
648 ALLOC(buf16k, PLC_UPDATE_SAMPLES, opus_int16)buf16k = ((opus_int16*)__builtin_alloca (sizeof(opus_int16)*(
(4*FRAME_SIZE))))
;
649 if (CC == 1) OPUS_COPY(buf48k, decode_mem[0], DECODE_BUFFER_SIZE)(memcpy((buf48k), (decode_mem[0]), (2048)*sizeof(*(buf48k)) +
0*((buf48k)-(decode_mem[0])) ))
;
650 else {
651 for (i=0;i<DECODE_BUFFER_SIZE2048;i++) {
652 buf48k[i] = .5*(decode_mem[0][i] + decode_mem[1][i]);
653 }
654 }
655 /* Down-sample the last 40 ms. */
656 for (i=1;i<DECODE_BUFFER_SIZE2048;i++) buf48k[i] += PREEMPHASIS*buf48k[i-1];
657 *plc_preemphasis_mem = buf48k[DECODE_BUFFER_SIZE2048-1];
658 offset = DECODE_BUFFER_SIZE2048-SINC_ORDER-1 - 3*(PLC_UPDATE_SAMPLES(4*FRAME_SIZE)-1);
659 celt_assert(3*(PLC_UPDATE_SAMPLES-1) + SINC_ORDER + offset == DECODE_BUFFER_SIZE-1){if (!(3*((4*FRAME_SIZE)-1) + SINC_ORDER + offset == 2048 -1)
) {celt_fatal("assertion failed: " "3*(PLC_UPDATE_SAMPLES-1) + SINC_ORDER + offset == DECODE_BUFFER_SIZE-1"
, "/root/firefox-clang/media/libopus/celt/celt_decoder.c", 659
);}}
;
660 for (i=0;i<PLC_UPDATE_SAMPLES(4*FRAME_SIZE);i++) {
661 int j;
662 float sum = 0;
663 for (j=0;j<SINC_ORDER+1;j++) {
664 sum += buf48k[3*i + j + offset]*sinc_filter[j];
665 }
666 buf16k[i] = float2int(MIN32(32767.f, MAX32(-32767.f, sum))((32767.f) < (((-32767.f) > (sum) ? (-32767.f) : (sum))
) ? (32767.f) : (((-32767.f) > (sum) ? (-32767.f) : (sum))
))
);
667 }
668 tmp_read_post = lpcnet->fec_read_pos;
669 tmp_fec_skip = lpcnet->fec_skip;
670 for (i=0;i<PLC_UPDATE_FRAMES4;i++) {
671 lpcnet_plc_update(lpcnet, &buf16k[FRAME_SIZE*i]);
672 }
673 lpcnet->fec_read_pos = tmp_read_post;
674 lpcnet->fec_skip = tmp_fec_skip;
675 RESTORE_STACK;
676}
677#endif
678
679static void celt_decode_lost(CELTDecoderOpusCustomDecoder * OPUS_RESTRICTrestrict st, int N, int LM
680#ifdef ENABLE_DEEP_PLC
681 ,LPCNetPLCState *lpcnet
682#endif
683 )
684{
685 int c;
686 int i;
687 const int C = st->channels;
688 celt_sig *decode_mem[2];
689 celt_sig *out_syn[2];
690 opus_val16 *lpc;
691 celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
692 const OpusCustomMode *mode;
693 int nbEBands;
694 int overlap;
695 int start;
696 int loss_duration;
697 int curr_frame_type;
698 const opus_int16 *eBands;
699 int decode_buffer_size;
700 int max_period;
701#ifdef ENABLE_QEXT
702 int qext_scale;
703#endif
704 SAVE_STACK;
705#ifdef ENABLE_QEXT
706 qext_scale = st->qext_scale;
707#endif
708 decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE)(2048);
709 max_period = QEXT_SCALE(MAX_PERIOD)(1024);
710 mode = st->mode;
711 nbEBands = mode->nbEBands;
712 overlap = mode->overlap;
713 eBands = mode->eBands;
714
715 c=0; do {
716 decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
717 out_syn[c] = decode_mem[c]+decode_buffer_size-N;
718 } while (++c<C);
719 oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*C);
720 oldLogE = oldBandE + 2*nbEBands;
721 oldLogE2 = oldLogE + 2*nbEBands;
722 backgroundLogE = oldLogE2 + 2*nbEBands;
723 lpc = (opus_val16*)(backgroundLogE + 2*nbEBands);
724
725 loss_duration = st->loss_duration;
726 start = st->start;
727 curr_frame_type = FRAME_PLC_PERIODIC3;
728 if (st->plc_duration >= 40 || start != 0 || st->skip_plc)
729 curr_frame_type = FRAME_PLC_NOISE2;
730#ifdef ENABLE_DEEP_PLC
731 if (start == 0 && lpcnet != NULL((void*)0) && st->mode->Fs != 96000 && lpcnet->loaded)
732 {
733 if (st->complexity >= 5 && st->plc_duration < 80 && !st->skip_plc)
734 curr_frame_type = FRAME_PLC_NEURAL4;
735#ifdef ENABLE_DRED
736 if (lpcnet->fec_fill_pos > lpcnet->fec_read_pos)
737 curr_frame_type = FRAME_DRED5;
738#endif
739 }
740#endif
741
742 if (curr_frame_type == FRAME_PLC_NOISE2)
743 {
744 /* Noise-based PLC/CNG */
745 VARDECL(celt_norm, X)celt_norm *X;
746 opus_uint32 seed;
747 int end;
748 int effEnd;
749 celt_glog decay;
750 end = st->end;
751 effEnd = IMAX(start, IMIN(end, mode->effEBands))((start) > (((end) < (mode->effEBands) ? (end) : (mode
->effEBands))) ? (start) : (((end) < (mode->effEBands
) ? (end) : (mode->effEBands))))
;
752
753 ALLOC(X, C*N, celt_norm)X = ((celt_norm*)__builtin_alloca (sizeof(celt_norm)*(C*N))); /**< Interleaved normalised MDCTs */
754 c=0; do {
755 OPUS_MOVE(decode_mem[c], decode_mem[c]+N,(memmove((decode_mem[c]), (decode_mem[c]+N), (decode_buffer_size
-N+overlap)*sizeof(*(decode_mem[c])) + 0*((decode_mem[c])-(decode_mem
[c]+N)) ))
756 decode_buffer_size-N+overlap)(memmove((decode_mem[c]), (decode_mem[c]+N), (decode_buffer_size
-N+overlap)*sizeof(*(decode_mem[c])) + 0*((decode_mem[c])-(decode_mem
[c]+N)) ))
;
757 } while (++c<C);
758
759 if (st->prefilter_and_fold) {
760 prefilter_and_fold(st, N);
761 }
762
763 /* Energy decay */
764 decay = loss_duration==0 ? GCONST(1.5f)(1.5f) : GCONST(.5f)(.5f);
765 c=0; do
766 {
767 for (i=start;i<end;i++)
768 oldBandE[c*nbEBands+i] = MAXG(backgroundLogE[c*nbEBands+i], oldBandE[c*nbEBands+i] - decay)((backgroundLogE[c*nbEBands+i]) > (oldBandE[c*nbEBands+i] -
decay) ? (backgroundLogE[c*nbEBands+i]) : (oldBandE[c*nbEBands
+i] - decay))
;
769 } while (++c<C);
770 seed = st->rng;
771 for (c=0;c<C;c++)
772 {
773 for (i=start;i<effEnd;i++)
774 {
775 int j;
776 int boffs;
777 int blen;
778 boffs = N*c+(eBands[i]<<LM);
779 blen = (eBands[i+1]-eBands[i])<<LM;
780 for (j=0;j<blen;j++)
781 {
782 seed = celt_lcg_rand(seed);
783 X[boffs+j] = SHL32((celt_norm)((opus_int32)seed>>20), NORM_SHIFT-14)((celt_norm)((opus_int32)seed>>20));
784 }
785 renormalise_vector(X+boffs, blen, Q31ONE1.0f, st->arch);
786 }
787 }
788 st->rng = seed;
789
790 celt_synthesis(mode, X, out_syn, oldBandE, start, effEnd, C, C, 0, LM, st->downsample, 0, st->arch ARG_QEXT(NULL) ARG_QEXT(NULL) ARG_QEXT(0));
791
792 /* Run the postfilter with the last parameters. */
793 c=0; do {
794 st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD)((st->postfilter_period) > (15) ? (st->postfilter_period
) : (15))
;
795 st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD)((st->postfilter_period_old) > (15) ? (st->postfilter_period_old
) : (15))
;
796 comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
797 st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
798 mode->window, overlap, st->arch);
799 if (LM!=0)
800 comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, st->postfilter_period, N-mode->shortMdctSize,
801 st->postfilter_gain, st->postfilter_gain, st->postfilter_tapset, st->postfilter_tapset,
802 mode->window, overlap, st->arch);
803
804 } while (++c<C);
805 st->postfilter_period_old = st->postfilter_period;
806 st->postfilter_gain_old = st->postfilter_gain;
807 st->postfilter_tapset_old = st->postfilter_tapset;
808
809 st->prefilter_and_fold = 0;
810 /* Skip regular PLC until we get two consecutive packets. */
811 st->skip_plc = 1;
812 } else {
813 int exc_length;
814 /* Pitch-based PLC */
815 const celt_coef *window;
816 opus_val16 *exc;
817 opus_val16 fade = Q15ONE1.0f;
818 int pitch_index;
819 int curr_neural;
820 int last_neural;
821 VARDECL(opus_val16, _exc)opus_val16 *_exc;
822 VARDECL(opus_val16, fir_tmp)opus_val16 *fir_tmp;
823
824 curr_neural = curr_frame_type == FRAME_PLC_NEURAL4 || curr_frame_type == FRAME_DRED5;
825 last_neural = st->last_frame_type == FRAME_PLC_NEURAL4 || st->last_frame_type == FRAME_DRED5;
826 if (st->last_frame_type != FRAME_PLC_PERIODIC3 && !(last_neural && curr_neural))
827 {
828 st->last_pitch_index = pitch_index = celt_plc_pitch_search(st, decode_mem, C, st->arch);
829 } else {
830 pitch_index = st->last_pitch_index;
831 fade = QCONST16(.8f,15)(.8f);
832 }
833#ifdef ENABLE_DEEP_PLC
834 if (curr_neural && !last_neural) update_plc_state(lpcnet, decode_mem, &st->plc_preemphasis_mem, C);
835#endif
836
837 /* We want the excitation for 2 pitch periods in order to look for a
838 decaying signal, but we can't get more than MAX_PERIOD. */
839 exc_length = IMIN(2*pitch_index, max_period)((2*pitch_index) < (max_period) ? (2*pitch_index) : (max_period
))
;
840
841 ALLOC(_exc, max_period+CELT_LPC_ORDER, opus_val16)_exc = ((opus_val16*)__builtin_alloca (sizeof(opus_val16)*(max_period
+24)))
;
842 ALLOC(fir_tmp, exc_length, opus_val16)fir_tmp = ((opus_val16*)__builtin_alloca (sizeof(opus_val16)*
(exc_length)))
;
843 exc = _exc+CELT_LPC_ORDER24;
844 window = mode->window;
845 c=0; do {
846 opus_val16 decay;
847 opus_val16 attenuation;
848 opus_val32 S1=0;
849 celt_sig *buf;
850 int extrapolation_offset;
851 int extrapolation_len;
852 int j;
853
854 buf = decode_mem[c];
855 for (i=0;i<max_period+CELT_LPC_ORDER24;i++)
856 exc[i-CELT_LPC_ORDER24] = SROUND16(buf[decode_buffer_size-max_period-CELT_LPC_ORDER+i], SIG_SHIFT)(buf[decode_buffer_size-max_period-24 +i]);
857
858 if (st->last_frame_type != FRAME_PLC_PERIODIC3 && !(last_neural && curr_neural))
859 {
860 opus_val32 ac[CELT_LPC_ORDER24+1];
861 /* Compute LPC coefficients for the last MAX_PERIOD samples before
862 the first loss so we can work in the excitation-filter domain. */
863 _celt_autocorr(exc, ac, window, overlap,
864 CELT_LPC_ORDER24, max_period, st->arch);
865 /* Add a noise floor of -40 dB. */
866#ifdef FIXED_POINT
867 ac[0] += SHR32(ac[0],13)(ac[0]);
868#else
869 ac[0] *= 1.0001f;
870#endif
871 /* Use lag windowing to stabilize the Levinson-Durbin recursion. */
872 for (i=1;i<=CELT_LPC_ORDER24;i++)
873 {
874 /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/
875#ifdef FIXED_POINT
876 ac[i] -= MULT16_32_Q15(2*i*i, ac[i])((2*i*i)*(ac[i]));
877#else
878 ac[i] -= ac[i]*(0.008f*0.008f)*i*i;
879#endif
880 }
881 _celt_lpc(lpc+c*CELT_LPC_ORDER24, ac, CELT_LPC_ORDER24);
882#ifdef FIXED_POINT
883 /* For fixed-point, apply bandwidth expansion until we can guarantee that
884 no overflow can happen in the IIR filter. This means:
885 32768*sum(abs(filter)) < 2^31 */
886 while (1) {
887 opus_val16 tmp=Q15ONE1.0f;
888 opus_val32 sum=QCONST16(1., SIG_SHIFT)(1.);
889 for (i=0;i<CELT_LPC_ORDER24;i++)
890 sum += ABS16(lpc[c*CELT_LPC_ORDER+i])((float)fabs(lpc[c*24 +i]));
891 if (sum < 65535) break;
892 for (i=0;i<CELT_LPC_ORDER24;i++)
893 {
894 tmp = MULT16_16_Q15(QCONST16(.99f,15), tmp)(((.99f))*(tmp));
895 lpc[c*CELT_LPC_ORDER24+i] = MULT16_16_Q15(lpc[c*CELT_LPC_ORDER+i], tmp)((lpc[c*24 +i])*(tmp));
896 }
897 }
898#endif
899 }
900 /* Initialize the LPC history with the samples just before the start
901 of the region for which we're computing the excitation. */
902 {
903 /* Compute the excitation for exc_length samples before the loss. We need the copy
904 because celt_fir() cannot filter in-place. */
905 celt_fir(exc+max_period-exc_length, lpc+c*CELT_LPC_ORDER,(celt_fir_c(exc+max_period-exc_length, lpc+c*24, fir_tmp, exc_length
, 24, st->arch))
906 fir_tmp, exc_length, CELT_LPC_ORDER, st->arch)(celt_fir_c(exc+max_period-exc_length, lpc+c*24, fir_tmp, exc_length
, 24, st->arch))
;
907 OPUS_COPY(exc+max_period-exc_length, fir_tmp, exc_length)(memcpy((exc+max_period-exc_length), (fir_tmp), (exc_length)*
sizeof(*(exc+max_period-exc_length)) + 0*((exc+max_period-exc_length
)-(fir_tmp)) ))
;
908 }
909
910 /* Check if the waveform is decaying, and if so how fast.
911 We do this to avoid adding energy when concealing in a segment
912 with decaying energy. */
913 {
914 opus_val32 E1=1, E2=1;
915 int decay_length;
916#ifdef FIXED_POINT
917 int shift = IMAX(0,2*celt_zlog2(celt_maxabs16(&exc[max_period-exc_length], exc_length))-20)((0) > (2*celt_zlog2(celt_maxabs16(&exc[max_period-exc_length
], exc_length))-20) ? (0) : (2*celt_zlog2(celt_maxabs16(&
exc[max_period-exc_length], exc_length))-20))
;
918#ifdef ENABLE_QEXT
919 if (st->qext_scale==2) shift++;
920#endif
921#endif
922 decay_length = exc_length>>1;
923 for (i=0;i<decay_length;i++)
924 {
925 opus_val16 e;
926 e = exc[max_period-decay_length+i];
927 E1 += SHR32(MULT16_16(e, e), shift)(((opus_val32)(e)*(opus_val32)(e)));
928 e = exc[max_period-2*decay_length+i];
929 E2 += SHR32(MULT16_16(e, e), shift)(((opus_val32)(e)*(opus_val32)(e)));
930 }
931 E1 = MIN32(E1, E2)((E1) < (E2) ? (E1) : (E2));
932 decay = celt_sqrt(frac_div32(SHR32(E1, 1), E2))((float)sqrt(((float)((E1))/(E2))));
933 }
934
935 /* Move the decoder memory one frame to the left to give us room to
936 add the data for the new frame. We ignore the overlap that extends
937 past the end of the buffer, because we aren't going to use it. */
938 OPUS_MOVE(buf, buf+N, decode_buffer_size-N)(memmove((buf), (buf+N), (decode_buffer_size-N)*sizeof(*(buf)
) + 0*((buf)-(buf+N)) ))
;
939
940 /* Extrapolate from the end of the excitation with a period of
941 "pitch_index", scaling down each period by an additional factor of
942 "decay". */
943 extrapolation_offset = max_period-pitch_index;
944 /* We need to extrapolate enough samples to cover a complete MDCT
945 window (including overlap/2 samples on both sides). */
946 extrapolation_len = N+overlap;
947 /* We also apply fading if this is not the first loss. */
948 attenuation = MULT16_16_Q15(fade, decay)((fade)*(decay));
949 for (i=j=0;i<extrapolation_len;i++,j++)
950 {
951 opus_val16 tmp;
952 if (j >= pitch_index) {
953 j -= pitch_index;
954 attenuation = MULT16_16_Q15(attenuation, decay)((attenuation)*(decay));
955 }
956 buf[decode_buffer_size-N+i] =
957 SHL32(EXTEND32(MULT16_16_Q15(attenuation,((((attenuation)*(exc[extrapolation_offset+j]))))
958 exc[extrapolation_offset+j])), SIG_SHIFT)((((attenuation)*(exc[extrapolation_offset+j]))));
959 /* Compute the energy of the previously decoded signal whose
960 excitation we're copying. */
961 tmp = SROUND16((buf[decode_buffer_size-max_period-N+extrapolation_offset+j])
962 buf[decode_buffer_size-max_period-N+extrapolation_offset+j],(buf[decode_buffer_size-max_period-N+extrapolation_offset+j])
963 SIG_SHIFT)(buf[decode_buffer_size-max_period-N+extrapolation_offset+j]);
964 S1 += SHR32(MULT16_16(tmp, tmp), 11)(((opus_val32)(tmp)*(opus_val32)(tmp)));
965 }
966 {
967 opus_val16 lpc_mem[CELT_LPC_ORDER24];
968 /* Copy the last decoded samples (prior to the overlap region) to
969 synthesis filter memory so we can have a continuous signal. */
970 for (i=0;i<CELT_LPC_ORDER24;i++)
971 lpc_mem[i] = SROUND16(buf[decode_buffer_size-N-1-i], SIG_SHIFT)(buf[decode_buffer_size-N-1-i]);
972 /* Apply the synthesis filter to convert the excitation back into
973 the signal domain. */
974 celt_iir(buf+decode_buffer_size-N, lpc+c*CELT_LPC_ORDER24,
975 buf+decode_buffer_size-N, extrapolation_len, CELT_LPC_ORDER24,
976 lpc_mem, st->arch);
977#ifdef FIXED_POINT
978 for (i=0; i < extrapolation_len; i++)
979 buf[decode_buffer_size-N+i] = SATURATE(buf[decode_buffer_size-N+i], SIG_SAT)(buf[decode_buffer_size-N+i]);
980#endif
981 }
982
983 /* Check if the synthesis energy is higher than expected, which can
984 happen with the signal changes during our window. If so,
985 attenuate. */
986 {
987 opus_val32 S2=0;
988 for (i=0;i<extrapolation_len;i++)
989 {
990 opus_val16 tmp = SROUND16(buf[decode_buffer_size-N+i], SIG_SHIFT)(buf[decode_buffer_size-N+i]);
991 S2 += SHR32(MULT16_16(tmp, tmp), 11)(((opus_val32)(tmp)*(opus_val32)(tmp)));
992 }
993 /* This checks for an "explosion" in the synthesis. */
994#ifdef FIXED_POINT
995 if (!(S1 > SHR32(S2,2)(S2)))
996#else
997 /* The float test is written this way to catch NaNs in the output
998 of the IIR filter at the same time. */
999 if (!(S1 > 0.2f*S2))
1000#endif
1001 {
1002 for (i=0;i<extrapolation_len;i++)
1003 buf[decode_buffer_size-N+i] = 0;
1004 } else if (S1 < S2)
1005 {
1006 opus_val16 ratio = celt_sqrt(frac_div32(SHR32(S1,1)+1,S2+1))((float)sqrt(((float)((S1)+1)/(S2+1))));
1007 for (i=0;i<overlap;i++)
1008 {
1009 opus_val16 tmp_g = Q15ONE1.0f
1010 - MULT16_16_Q15(COEF2VAL16(window[i]), Q15ONE-ratio)(((window[i]))*(1.0f -ratio));
1011 buf[decode_buffer_size-N+i] =
1012 MULT16_32_Q15(tmp_g, buf[decode_buffer_size-N+i])((tmp_g)*(buf[decode_buffer_size-N+i]));
1013 }
1014 for (i=overlap;i<extrapolation_len;i++)
1015 {
1016 buf[decode_buffer_size-N+i] =
1017 MULT16_32_Q15(ratio, buf[decode_buffer_size-N+i])((ratio)*(buf[decode_buffer_size-N+i]));
1018 }
1019 }
1020 }
1021
1022 } while (++c<C);
1023
1024#ifdef ENABLE_DEEP_PLC
1025 if (curr_neural) {
1026 float overlap_mem;
1027 int samples_needed16k;
1028 celt_sig *buf;
1029 VARDECL(float, buf_copy)float *buf_copy;
1030 buf = decode_mem[0];
1031 ALLOC(buf_copy, C*overlap, float)buf_copy = ((float*)__builtin_alloca (sizeof(float)*(C*overlap
)))
;
1032 c=0; do {
1033 OPUS_COPY(buf_copy+c*overlap, &decode_mem[c][decode_buffer_size-N], overlap)(memcpy((buf_copy+c*overlap), (&decode_mem[c][decode_buffer_size
-N]), (overlap)*sizeof(*(buf_copy+c*overlap)) + 0*((buf_copy+
c*overlap)-(&decode_mem[c][decode_buffer_size-N])) ))
;
1034 } while (++c<C);
1035
1036 /* Need enough samples from the PLC to cover the frame size, resampling delay,
1037 and the overlap at the end. */
1038 samples_needed16k = (N+SINC_ORDER+overlap)/3;
1039 if (!last_neural) {
1040 st->plc_fill = 0;
1041 }
1042 while (st->plc_fill < samples_needed16k) {
1043 lpcnet_plc_conceal(lpcnet, &st->plc_pcm[st->plc_fill]);
1044 st->plc_fill += FRAME_SIZE;
1045 }
1046 /* Resample to 48 kHz. */
1047 for (i=0;i<(N+overlap)/3;i++) {
1048 int j;
1049 float sum;
1050 for (sum=0, j=0;j<17;j++) sum += 3*st->plc_pcm[i+j]*sinc_filter[3*j];
1051 buf[decode_buffer_size-N+3*i] = sum;
1052 for (sum=0, j=0;j<16;j++) sum += 3*st->plc_pcm[i+j+1]*sinc_filter[3*j+2];
1053 buf[decode_buffer_size-N+3*i+1] = sum;
1054 for (sum=0, j=0;j<16;j++) sum += 3*st->plc_pcm[i+j+1]*sinc_filter[3*j+1];
1055 buf[decode_buffer_size-N+3*i+2] = sum;
1056 }
1057 OPUS_MOVE(st->plc_pcm, &st->plc_pcm[N/3], st->plc_fill-N/3)(memmove((st->plc_pcm), (&st->plc_pcm[N/3]), (st->
plc_fill-N/3)*sizeof(*(st->plc_pcm)) + 0*((st->plc_pcm)
-(&st->plc_pcm[N/3])) ))
;
1058 st->plc_fill -= N/3;
1059 for (i=0;i<N;i++) {
1060 float tmp = buf[decode_buffer_size-N+i];
1061 buf[decode_buffer_size-N+i] -= PREEMPHASIS*st->plc_preemphasis_mem;
1062 st->plc_preemphasis_mem = tmp;
1063 }
1064 overlap_mem = st->plc_preemphasis_mem;
1065 for (i=0;i<overlap;i++) {
1066 float tmp = buf[decode_buffer_size+i];
1067 buf[decode_buffer_size+i] -= PREEMPHASIS*overlap_mem;
1068 overlap_mem = tmp;
1069 }
1070 /* For now, we just do mono PLC. */
1071 if (C==2) OPUS_COPY(decode_mem[1], decode_mem[0], decode_buffer_size+overlap)(memcpy((decode_mem[1]), (decode_mem[0]), (decode_buffer_size
+overlap)*sizeof(*(decode_mem[1])) + 0*((decode_mem[1])-(decode_mem
[0])) ))
;
1072 c=0; do {
1073 /* Cross-fade with 48-kHz non-neural PLC for the first 2.5 ms to avoid a discontinuity. */
1074 if (!last_neural) {
1075 for (i=0;i<overlap;i++) decode_mem[c][decode_buffer_size-N+i] = (1-window[i])*buf_copy[c*overlap+i] + (window[i])*decode_mem[c][decode_buffer_size-N+i];
1076 }
1077 } while (++c<C);
1078 }
1079#endif
1080 st->prefilter_and_fold = 1;
1081 }
1082
1083 /* Saturate to something large to avoid wrap-around. */
1084 st->loss_duration = IMIN(10000, loss_duration+(1<<LM))((10000) < (loss_duration+(1<<LM)) ? (10000) : (loss_duration
+(1<<LM)))
;
1085 st->plc_duration = IMIN(10000, st->plc_duration+(1<<LM))((10000) < (st->plc_duration+(1<<LM)) ? (10000) :
(st->plc_duration+(1<<LM)))
;
1086#ifdef ENABLE_DRED
1087 if (curr_frame_type == FRAME_DRED5) {
1088 st->plc_duration = 0;
1089 st->skip_plc = 0;
1090 }
1091#endif
1092 st->last_frame_type = curr_frame_type;
1093 RESTORE_STACK;
1094}
1095
1096#ifdef ENABLE_QEXT
1097static void decode_qext_stereo_params(ec_dec *ec, int qext_end, int *qext_intensity, int *qext_dual_stereo) {
1098 *qext_intensity = ec_dec_uint(ec, qext_end+1);
1099 if (*qext_intensity != 0) *qext_dual_stereo = ec_dec_bit_logp(ec, 1);
1100 else *qext_dual_stereo = 0;
1101}
1102#endif
1103
1104int celt_decode_with_ec_dred(CELTDecoderOpusCustomDecoder * OPUS_RESTRICTrestrict st, const unsigned char *data,
1105 int len, opus_res * OPUS_RESTRICTrestrict pcm, int frame_size, ec_dec *dec, int accum
1106#ifdef ENABLE_DEEP_PLC
1107 ,LPCNetPLCState *lpcnet
1108#endif
1109 ARG_QEXT(const unsigned char *qext_payload) ARG_QEXT(int qext_payload_len)
1110 )
1111{
1112 int c, i, N;
1113 int spread_decision;
1114 opus_int32 bits;
1115 ec_dec _dec;
1116 VARDECL(celt_norm, X)celt_norm *X;
1117 VARDECL(int, fine_quant)int *fine_quant;
1118 VARDECL(int, pulses)int *pulses;
1119 VARDECL(int, cap)int *cap;
1120 VARDECL(int, offsets)int *offsets;
1121 VARDECL(int, fine_priority)int *fine_priority;
1122 VARDECL(int, tf_res)int *tf_res;
1123 VARDECL(unsigned char, collapse_masks)unsigned char *collapse_masks;
1124 celt_sig *decode_mem[2];
1125 celt_sig *out_syn[2];
1126 celt_glog *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
1127
1128 int shortBlocks;
1129 int isTransient;
1130 int intra_ener;
1131 const int CC = st->channels;
1132 int LM, M;
1133 int start;
1134 int end;
1135 int effEnd;
1136 int codedBands;
1137 int alloc_trim;
1138 int postfilter_pitch;
1139 opus_val16 postfilter_gain;
1140 int intensity=0;
1141 int dual_stereo=0;
1142 opus_int32 total_bits;
1143 opus_int32 balance;
1144 opus_int32 tell;
1145 int dynalloc_logp;
1146 int postfilter_tapset;
1147 int anti_collapse_rsv;
1148 int anti_collapse_on=0;
1149 int silence;
1150 int C = st->stream_channels;
1151 const OpusCustomMode *mode;
1152 int nbEBands;
1153 int overlap;
1154 const opus_int16 *eBands;
1155 celt_glog max_background_increase;
1156 int decode_buffer_size;
1157#ifdef ENABLE_QEXT
1158 opus_int32 qext_bits;
1159 ec_dec ext_dec;
1160 int qext_bytes0=0;
1161 int qext_end=0;
1162 int qext_intensity=0;
1163 int qext_dual_stereo=0;
1164 VARDECL(int, extra_quant)int *extra_quant;
1165 VARDECL(int, extra_pulses)int *extra_pulses;
1166 const CELTModeOpusCustomMode *qext_mode = NULL((void*)0);
1167 CELTModeOpusCustomMode qext_mode_struct;
1168 int qext_scale;
1169#else
1170# define qext_bytes0 0
1171#endif
1172 ALLOC_STACK;
1173#ifdef ENABLE_QEXT
1174 qext_scale = st->qext_scale;
1175#endif
1176 decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE)(2048);
1177
1178 VALIDATE_CELT_DECODER(st)validate_celt_decoder(st);
1179 mode = st->mode;
1180 nbEBands = mode->nbEBands;
1181 overlap = mode->overlap;
1182 eBands = mode->eBands;
1183 start = st->start;
1184 end = st->end;
1185 frame_size *= st->downsample;
1186
1187 oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+overlap)*CC);
1188 oldLogE = oldBandE + 2*nbEBands;
1189 oldLogE2 = oldLogE + 2*nbEBands;
1190 backgroundLogE = oldLogE2 + 2*nbEBands;
1191
1192#ifdef ENABLE_QEXT
1193 if (qext_payload) {
1194 ec_dec_init(&ext_dec, (unsigned char*)qext_payload, qext_payload_len);
1195 qext_bytes0 = qext_payload_len;
1196 } else {
1197 ec_dec_init(&ext_dec, NULL((void*)0), 0);
1198 }
1199#endif
1200#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API)
1201 if (st->signalling && data!=NULL((void*)0))
1202 {
1203 int data0=data[0];
1204 /* Convert "standard mode" to Opus header */
1205# ifndef ENABLE_QEXT
1206 if (mode->Fs==48000 && mode->shortMdctSize==120)
1207# endif
1208 {
1209 data0 = fromOpus(data0);
1210 if (data0<0)
1211 return OPUS_INVALID_PACKET-4;
1212 }
1213 st->end = end = IMAX(1, mode->effEBands-2*(data0>>5))((1) > (mode->effEBands-2*(data0>>5)) ? (1) : (mode
->effEBands-2*(data0>>5)))
;
1214 LM = (data0>>3)&0x3;
1215 C = 1 + ((data0>>2)&0x1);
1216 if ((data[0] & 0x03) == 0x03) {
1217 data++;
1218 len--;
1219 if (len<=0)
1220 return OPUS_INVALID_PACKET-4;
1221 if (data[0] & 0x40) {
1222 int p;
1223 int padding=0;
1224 data++;
1225 len--;
1226 do {
1227 int tmp;
1228 if (len<=0)
1229 return OPUS_INVALID_PACKET-4;
1230 p = *data++;
1231 len--;
1232 tmp = p==255 ? 254: p;
1233 len -= tmp;
1234 padding += tmp;
1235 } while (p==255);
1236 padding--;
1237 if (len <= 0 || padding<0) return OPUS_INVALID_PACKET-4;
1238#ifdef ENABLE_QEXT
1239 qext_bytes0 = padding;
1240 if (data[len] != QEXT_EXTENSION_ID124<<1)
1241 qext_bytes0=0;
1242 ec_dec_init(&ext_dec, (unsigned char*)data+len+1, qext_bytes0);
1243#endif
1244 }
1245 } else
1246 {
1247 data++;
1248 len--;
1249 }
1250 if (LM>mode->maxLM)
1251 return OPUS_INVALID_PACKET-4;
1252 if (frame_size < mode->shortMdctSize<<LM)
1253 return OPUS_BUFFER_TOO_SMALL-2;
1254 else
1255 frame_size = mode->shortMdctSize<<LM;
1256 } else {
1257#else
1258 {
1259#endif
1260 for (LM=0;LM<=mode->maxLM;LM++)
1
Assuming 'LM' is <= field 'maxLM'
2
Loop condition is true. Entering loop body
1261 if (mode->shortMdctSize<<LM==frame_size)
3
Assuming the condition is true
4
Taking true branch
1262 break;
1263 if (LM
5.1
'LM' is <= field 'maxLM'
>mode->maxLM)
5
Execution continues on line 1263
6
Taking false branch
1264 return OPUS_BAD_ARG-1;
1265 }
1266 M=1<<LM;
1267
1268 if (len<0 || len>1275 || pcm==NULL((void*)0))
7
Assuming 'len' is >= 0
8
Assuming 'len' is <= 1275
9
Assuming 'pcm' is not equal to NULL
10
Taking false branch
1269 return OPUS_BAD_ARG-1;
1270
1271 N = M*mode->shortMdctSize;
1272 c=0; do {
11
Loop condition is true. Execution continues on line 1273
12
Loop condition is false. Exiting loop
1273 decode_mem[c] = st->_decode_mem + c*(decode_buffer_size+overlap);
1274 out_syn[c] = decode_mem[c]+decode_buffer_size-N;
1275 } while (++c<CC);
1276
1277 effEnd = end;
1278 if (effEnd > mode->effEBands)
13
Assuming 'effEnd' is <= field 'effEBands'
1279 effEnd = mode->effEBands;
1280
1281 if (data == NULL((void*)0) || len<=1)
14
Assuming 'data' is equal to NULL
1282 {
1283 celt_decode_lost(st, N, LM
1284#ifdef ENABLE_DEEP_PLC
1285 , lpcnet
1286#endif
1287 );
1288 deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
15
Calling 'deemphasis'
1289 RESTORE_STACK;
1290 return frame_size/st->downsample;
1291 }
1292#ifdef ENABLE_DEEP_PLC
1293 else {
1294 /* FIXME: This is a bit of a hack just to make sure opus_decode_native() knows we're no longer in PLC. */
1295 if (lpcnet) lpcnet->blend = 0;
1296 }
1297#endif
1298
1299 /* Check if there are at least two packets received consecutively before
1300 * turning on the pitch-based PLC */
1301 if (st->loss_duration == 0) st->skip_plc = 0;
1302
1303 if (dec == NULL((void*)0))
1304 {
1305 ec_dec_init(&_dec,(unsigned char*)data,len);
1306 dec = &_dec;
1307 }
1308
1309 if (C==1)
1310 {
1311 for (i=0;i<nbEBands;i++)
1312 oldBandE[i]=MAXG(oldBandE[i],oldBandE[nbEBands+i])((oldBandE[i]) > (oldBandE[nbEBands+i]) ? (oldBandE[i]) : (
oldBandE[nbEBands+i]))
;
1313 }
1314
1315 total_bits = len*8;
1316 tell = ec_tell(dec);
1317
1318 if (tell >= total_bits)
1319 silence = 1;
1320 else if (tell==1)
1321 silence = ec_dec_bit_logp(dec, 15);
1322 else
1323 silence = 0;
1324 if (silence)
1325 {
1326 /* Pretend we've read all the remaining bits */
1327 tell = len*8;
1328 dec->nbits_total+=tell-ec_tell(dec);
1329 }
1330
1331 postfilter_gain = 0;
1332 postfilter_pitch = 0;
1333 postfilter_tapset = 0;
1334 if (start==0 && tell+16 <= total_bits)
1335 {
1336 if(ec_dec_bit_logp(dec, 1))
1337 {
1338 int qg, octave;
1339 octave = ec_dec_uint(dec, 6);
1340 postfilter_pitch = (16<<octave)+ec_dec_bits(dec, 4+octave)-1;
1341 qg = ec_dec_bits(dec, 3);
1342 if (ec_tell(dec)+2<=total_bits)
1343 postfilter_tapset = ec_dec_icdf(dec, tapset_icdf, 2);
1344 postfilter_gain = QCONST16(.09375f,15)(.09375f)*(qg+1);
1345 }
1346 tell = ec_tell(dec);
1347 }
1348
1349 if (LM > 0 && tell+3 <= total_bits)
1350 {
1351 isTransient = ec_dec_bit_logp(dec, 3);
1352 tell = ec_tell(dec);
1353 }
1354 else
1355 isTransient = 0;
1356
1357 if (isTransient)
1358 shortBlocks = M;
1359 else
1360 shortBlocks = 0;
1361
1362 /* Decode the global flags (first symbols in the stream) */
1363 intra_ener = tell+3<=total_bits ? ec_dec_bit_logp(dec, 3) : 0;
1364 /* If recovering from packet loss, make sure we make the energy prediction safe to reduce the
1365 risk of getting loud artifacts. */
1366 if (!intra_ener && st->loss_duration != 0) {
1367 c=0; do
1368 {
1369 celt_glog safety = 0;
1370 int missing = IMIN(10, st->loss_duration>>LM)((10) < (st->loss_duration>>LM) ? (10) : (st->
loss_duration>>LM))
;
1371 if (LM==0) safety = GCONST(1.5f)(1.5f);
1372 else if (LM==1) safety = GCONST(.5f)(.5f);
1373 for (i=start;i<end;i++)
1374 {
1375 if (oldBandE[c*nbEBands+i] < MAXG(oldLogE[c*nbEBands+i], oldLogE2[c*nbEBands+i])((oldLogE[c*nbEBands+i]) > (oldLogE2[c*nbEBands+i]) ? (oldLogE
[c*nbEBands+i]) : (oldLogE2[c*nbEBands+i]))
) {
1376 /* If energy is going down already, continue the trend. */
1377 opus_val32 slope;
1378 opus_val32 E0, E1, E2;
1379 E0 = oldBandE[c*nbEBands+i];
1380 E1 = oldLogE[c*nbEBands+i];
1381 E2 = oldLogE2[c*nbEBands+i];
1382 slope = MAX32(E1 - E0, HALF32(E2 - E0))((E1 - E0) > ((.5f*(E2 - E0))) ? (E1 - E0) : ((.5f*(E2 - E0
))))
;
1383 slope = MING(slope, GCONST(2.f))((slope) < ((2.f)) ? (slope) : ((2.f)));
1384 E0 -= MAX32(0, (1+missing)*slope)((0) > ((1+missing)*slope) ? (0) : ((1+missing)*slope));
1385 oldBandE[c*nbEBands+i] = MAX32(-GCONST(20.f), E0)((-(20.f)) > (E0) ? (-(20.f)) : (E0));
1386 } else {
1387 /* Otherwise take the min of the last frames. */
1388 oldBandE[c*nbEBands+i] = MING(MING(oldBandE[c*nbEBands+i], oldLogE[c*nbEBands+i]), oldLogE2[c*nbEBands+i])((((oldBandE[c*nbEBands+i]) < (oldLogE[c*nbEBands+i]) ? (oldBandE
[c*nbEBands+i]) : (oldLogE[c*nbEBands+i]))) < (oldLogE2[c*
nbEBands+i]) ? (((oldBandE[c*nbEBands+i]) < (oldLogE[c*nbEBands
+i]) ? (oldBandE[c*nbEBands+i]) : (oldLogE[c*nbEBands+i]))) :
(oldLogE2[c*nbEBands+i]))
;
1389 }
1390 /* Shorter frames have more natural fluctuations -- play it safe. */
1391 oldBandE[c*nbEBands+i] -= safety;
1392 }
1393 } while (++c<2);
1394 }
1395 /* Get band energies */
1396 unquant_coarse_energy(mode, start, end, oldBandE,
1397 intra_ener, dec, C, LM);
1398
1399 ALLOC(tf_res, nbEBands, int)tf_res = ((int*)__builtin_alloca (sizeof(int)*(nbEBands)));
1400 tf_decode(start, end, isTransient, tf_res, LM, dec);
1401
1402 tell = ec_tell(dec);
1403 spread_decision = SPREAD_NORMAL(2);
1404 if (tell+4 <= total_bits)
1405 spread_decision = ec_dec_icdf(dec, spread_icdf, 5);
1406
1407 ALLOC(cap, nbEBands, int)cap = ((int*)__builtin_alloca (sizeof(int)*(nbEBands)));
1408
1409 init_caps(mode,cap,LM,C);
1410
1411 ALLOC(offsets, nbEBands, int)offsets = ((int*)__builtin_alloca (sizeof(int)*(nbEBands)));
1412
1413 dynalloc_logp = 6;
1414 total_bits<<=BITRES3;
1415 tell = ec_tell_frac(dec);
1416 for (i=start;i<end;i++)
1417 {
1418 int width, quanta;
1419 int dynalloc_loop_logp;
1420 int boost;
1421 width = C*(eBands[i+1]-eBands[i])<<LM;
1422 /* quanta is 6 bits, but no more than 1 bit/sample
1423 and no less than 1/8 bit/sample */
1424 quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width))((width<<3) < (((6<<3) > (width) ? (6<<
3) : (width))) ? (width<<3) : (((6<<3) > (width
) ? (6<<3) : (width))))
;
1425 dynalloc_loop_logp = dynalloc_logp;
1426 boost = 0;
1427 while (tell+(dynalloc_loop_logp<<BITRES3) < total_bits && boost < cap[i])
1428 {
1429 int flag;
1430 flag = ec_dec_bit_logp(dec, dynalloc_loop_logp);
1431 tell = ec_tell_frac(dec);
1432 if (!flag)
1433 break;
1434 boost += quanta;
1435 total_bits -= quanta;
1436 dynalloc_loop_logp = 1;
1437 }
1438 offsets[i] = boost;
1439 /* Making dynalloc more likely */
1440 if (boost>0)
1441 dynalloc_logp = IMAX(2, dynalloc_logp-1)((2) > (dynalloc_logp-1) ? (2) : (dynalloc_logp-1));
1442 }
1443
1444 ALLOC(fine_quant, nbEBands, int)fine_quant = ((int*)__builtin_alloca (sizeof(int)*(nbEBands))
)
;
1445 alloc_trim = tell+(6<<BITRES3) <= total_bits ?
1446 ec_dec_icdf(dec, trim_icdf, 7) : 5;
1447
1448 bits = (((opus_int32)len*8)<<BITRES3) - (opus_int32)ec_tell_frac(dec) - 1;
1449 anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES3) ? (1<<BITRES3) : 0;
1450 bits -= anti_collapse_rsv;
1451
1452 ALLOC(pulses, nbEBands, int)pulses = ((int*)__builtin_alloca (sizeof(int)*(nbEBands)));
1453 ALLOC(fine_priority, nbEBands, int)fine_priority = ((int*)__builtin_alloca (sizeof(int)*(nbEBands
)))
;
1454
1455 codedBands = clt_compute_allocation(mode, start, end, offsets, cap,
1456 alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses,
1457 fine_quant, fine_priority, C, LM, dec, 0, 0, 0);
1458
1459 unquant_fine_energy(mode, start, end, oldBandE, NULL((void*)0), fine_quant, dec, C);
1460
1461 ALLOC(X, C*N, celt_norm)X = ((celt_norm*)__builtin_alloca (sizeof(celt_norm)*(C*N))); /**< Interleaved normalised MDCTs */
1462
1463#ifdef ENABLE_QEXT
1464 if (qext_bytes0 && end == nbEBands &&
1465 ((mode->Fs == 48000 && (mode->shortMdctSize==120 || mode->shortMdctSize==90))
1466 || (mode->Fs == 96000 && (mode->shortMdctSize==240 || mode->shortMdctSize==180)))) {
1467 int qext_intra_ener;
1468 compute_qext_mode(&qext_mode_struct, mode);
1469 qext_mode = &qext_mode_struct;
1470 qext_end = ec_dec_bit_logp(&ext_dec, 1) ? NB_QEXT_BANDS : 2;
1471 if (C==2) decode_qext_stereo_params(&ext_dec, qext_end, &qext_intensity, &qext_dual_stereo);
1472 qext_intra_ener = ec_tell(&ext_dec)+3<=qext_bytes0*8 ? ec_dec_bit_logp(&ext_dec, 3) : 0;
1473 unquant_coarse_energy(qext_mode, 0, qext_end, st->qext_oldBandE,
1474 qext_intra_ener, &ext_dec, C, LM);
1475 }
1476 ALLOC(extra_quant, nbEBands+NB_QEXT_BANDS, int)extra_quant = ((int*)__builtin_alloca (sizeof(int)*(nbEBands+
NB_QEXT_BANDS)))
;
1477 ALLOC(extra_pulses, nbEBands+NB_QEXT_BANDS, int)extra_pulses = ((int*)__builtin_alloca (sizeof(int)*(nbEBands
+NB_QEXT_BANDS)))
;
1478 qext_bits = ((opus_int32)qext_bytes0*8<<BITRES3) - (opus_int32)ec_tell_frac(&ext_dec) - 1;
1479 clt_compute_extra_allocation(mode, qext_mode, start, end, qext_end, NULL((void*)0), NULL((void*)0),
1480 qext_bits, extra_pulses, extra_quant, C, LM, &ext_dec, 0, 0, 0);
1481 if (qext_bytes0 > 0) {
1482 unquant_fine_energy(mode, start, end, oldBandE, fine_quant, extra_quant, &ext_dec, C);
1483 }
1484#endif
1485
1486 c=0; do {
1487 OPUS_MOVE(decode_mem[c], decode_mem[c]+N, decode_buffer_size-N+overlap)(memmove((decode_mem[c]), (decode_mem[c]+N), (decode_buffer_size
-N+overlap)*sizeof(*(decode_mem[c])) + 0*((decode_mem[c])-(decode_mem
[c]+N)) ))
;
1488 } while (++c<CC);
1489
1490 /* Decode fixed codebook */
1491 ALLOC(collapse_masks, C*nbEBands, unsigned char)collapse_masks = ((unsigned char*)__builtin_alloca (sizeof(unsigned
char)*(C*nbEBands)))
;
1492
1493 quant_all_bands(0, mode, start, end, X, C==2 ? X+N : NULL((void*)0), collapse_masks,
1494 NULL((void*)0), pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_res,
1495 len*(8<<BITRES3)-anti_collapse_rsv, balance, dec, LM, codedBands, &st->rng, 0,
1496 st->arch, st->disable_inv
1497 ARG_QEXT(&ext_dec) ARG_QEXT(extra_pulses)
1498 ARG_QEXT(qext_bytes*(8<<BITRES)) ARG_QEXT(cap));
1499
1500#ifdef ENABLE_QEXT
1501 if (qext_mode) {
1502 VARDECL(int, zeros)int *zeros;
1503 VARDECL(unsigned char, qext_collapse_masks)unsigned char *qext_collapse_masks;
1504 ec_dec dummy_dec;
1505 int ext_balance;
1506 ALLOC(zeros, nbEBands, int)zeros = ((int*)__builtin_alloca (sizeof(int)*(nbEBands)));
1507 ALLOC(qext_collapse_masks, C*NB_QEXT_BANDS, unsigned char)qext_collapse_masks = ((unsigned char*)__builtin_alloca (sizeof
(unsigned char)*(C*NB_QEXT_BANDS)))
;
1508 ec_dec_init(&dummy_dec, NULL((void*)0), 0);
1509 OPUS_CLEAR(zeros, end)(memset((zeros), 0, (end)*sizeof(*(zeros))));
1510 ext_balance = qext_bytes0*(8<<BITRES3) - ec_tell_frac(&ext_dec);
1511 for (i=0;i<qext_end;i++) ext_balance -= extra_pulses[nbEBands+i] + C*(extra_quant[nbEBands+i]<<BITRES3);
1512 unquant_fine_energy(qext_mode, 0, qext_end, st->qext_oldBandE, NULL((void*)0), &extra_quant[nbEBands], &ext_dec, C);
1513 quant_all_bands(0, qext_mode, 0, qext_end, X, C==2 ? X+N : NULL((void*)0), qext_collapse_masks,
1514 NULL((void*)0), &extra_pulses[nbEBands], shortBlocks, spread_decision, qext_dual_stereo, qext_intensity, zeros,
1515 qext_bytes0*(8<<BITRES3), ext_balance, &ext_dec, LM, qext_end, &st->rng, 0,
1516 st->arch, st->disable_inv, &dummy_dec, zeros, 0, NULL((void*)0));
1517 }
1518#endif
1519
1520 if (anti_collapse_rsv > 0)
1521 {
1522 anti_collapse_on = ec_dec_bits(dec, 1);
1523 }
1524 unquant_energy_finalise(mode, start, end, (qext_bytes0 > 0) ? NULL((void*)0) : oldBandE,
1525 fine_quant, fine_priority, len*8-ec_tell(dec), dec, C);
1526 if (anti_collapse_on)
1527 anti_collapse(mode, X, collapse_masks, LM, C, N,
1528 start, end, oldBandE, oldLogE, oldLogE2, pulses, st->rng, 0, st->arch);
1529
1530 if (silence)
1531 {
1532 for (i=0;i<C*nbEBands;i++)
1533 oldBandE[i] = -GCONST(28.f)(28.f);
1534 }
1535 if (st->prefilter_and_fold) {
1536 prefilter_and_fold(st, N);
1537 }
1538 celt_synthesis(mode, X, out_syn, oldBandE, start, effEnd,
1539 C, CC, isTransient, LM, st->downsample, silence, st->arch ARG_QEXT(qext_mode) ARG_QEXT(st->qext_oldBandE) ARG_QEXT(qext_end));
1540
1541 c=0; do {
1542 st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD)((st->postfilter_period) > (15) ? (st->postfilter_period
) : (15))
;
1543 st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD)((st->postfilter_period_old) > (15) ? (st->postfilter_period_old
) : (15))
;
1544 comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
1545 st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
1546 mode->window, overlap, st->arch);
1547 if (LM!=0)
1548 comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize,
1549 st->postfilter_gain, postfilter_gain, st->postfilter_tapset, postfilter_tapset,
1550 mode->window, overlap, st->arch);
1551
1552 } while (++c<CC);
1553 st->postfilter_period_old = st->postfilter_period;
1554 st->postfilter_gain_old = st->postfilter_gain;
1555 st->postfilter_tapset_old = st->postfilter_tapset;
1556 st->postfilter_period = postfilter_pitch;
1557 st->postfilter_gain = postfilter_gain;
1558 st->postfilter_tapset = postfilter_tapset;
1559 if (LM!=0)
1560 {
1561 st->postfilter_period_old = st->postfilter_period;
1562 st->postfilter_gain_old = st->postfilter_gain;
1563 st->postfilter_tapset_old = st->postfilter_tapset;
1564 }
1565
1566 if (C==1)
1567 OPUS_COPY(&oldBandE[nbEBands], oldBandE, nbEBands)(memcpy((&oldBandE[nbEBands]), (oldBandE), (nbEBands)*sizeof
(*(&oldBandE[nbEBands])) + 0*((&oldBandE[nbEBands])-(
oldBandE)) ))
;
1568
1569 if (!isTransient)
1570 {
1571 OPUS_COPY(oldLogE2, oldLogE, 2*nbEBands)(memcpy((oldLogE2), (oldLogE), (2*nbEBands)*sizeof(*(oldLogE2
)) + 0*((oldLogE2)-(oldLogE)) ))
;
1572 OPUS_COPY(oldLogE, oldBandE, 2*nbEBands)(memcpy((oldLogE), (oldBandE), (2*nbEBands)*sizeof(*(oldLogE)
) + 0*((oldLogE)-(oldBandE)) ))
;
1573 } else {
1574 for (i=0;i<2*nbEBands;i++)
1575 oldLogE[i] = MING(oldLogE[i], oldBandE[i])((oldLogE[i]) < (oldBandE[i]) ? (oldLogE[i]) : (oldBandE[i
]))
;
1576 }
1577 /* In normal circumstances, we only allow the noise floor to increase by
1578 up to 2.4 dB/second, but when we're in DTX we give the weight of
1579 all missing packets to the update packet. */
1580 max_background_increase = IMIN(160, st->loss_duration+M)((160) < (st->loss_duration+M) ? (160) : (st->loss_duration
+M))
*GCONST(0.001f)(0.001f);
1581 for (i=0;i<2*nbEBands;i++)
1582 backgroundLogE[i] = MING(backgroundLogE[i] + max_background_increase, oldBandE[i])((backgroundLogE[i] + max_background_increase) < (oldBandE
[i]) ? (backgroundLogE[i] + max_background_increase) : (oldBandE
[i]))
;
1583 /* In case start or end were to change */
1584 c=0; do
1585 {
1586 for (i=0;i<start;i++)
1587 {
1588 oldBandE[c*nbEBands+i]=0;
1589 oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f)(28.f);
1590 }
1591 for (i=end;i<nbEBands;i++)
1592 {
1593 oldBandE[c*nbEBands+i]=0;
1594 oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-GCONST(28.f)(28.f);
1595 }
1596 } while (++c<2);
1597 st->rng = dec->rng;
1598#ifdef ENABLE_QEXT
1599 if (qext_bytes0) st->rng = st->rng ^ ext_dec.rng;
1600#endif
1601
1602 deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum);
1603 st->loss_duration = 0;
1604 st->plc_duration = 0;
1605 st->last_frame_type = FRAME_NORMAL1;
1606 st->prefilter_and_fold = 0;
1607 RESTORE_STACK;
1608 if (ec_tell(dec) > 8*len)
1609 return OPUS_INTERNAL_ERROR-3;
1610#ifdef ENABLE_QEXT
1611 if (qext_bytes0 != 0 && ec_tell(&ext_dec) > 8*qext_bytes0)
1612 return OPUS_INTERNAL_ERROR-3;
1613#endif
1614 if(ec_get_error(dec))
1615 st->error = 1;
1616 return frame_size/st->downsample;
1617}
1618
1619int celt_decode_with_ec(CELTDecoderOpusCustomDecoder * OPUS_RESTRICTrestrict st, const unsigned char *data,
1620 int len, opus_res * OPUS_RESTRICTrestrict pcm, int frame_size, ec_dec *dec, int accum)
1621{
1622 return celt_decode_with_ec_dred(st, data, len, pcm, frame_size, dec, accum
1623#ifdef ENABLE_DEEP_PLC
1624 , NULL((void*)0)
1625#endif
1626 ARG_QEXT(NULL) ARG_QEXT(0)
1627 );
1628}
1629
1630#if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API)
1631
1632#if defined(FIXED_POINT) && !defined(ENABLE_RES24)
1633int opus_custom_decode(CELTDecoderOpusCustomDecoder * OPUS_RESTRICTrestrict st, const unsigned char *data, int len, opus_int16 * OPUS_RESTRICTrestrict pcm, int frame_size)
1634{
1635 return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL((void*)0), 0);
1636}
1637#else
1638int opus_custom_decode(CELTDecoderOpusCustomDecoder * OPUS_RESTRICTrestrict st, const unsigned char *data, int len, opus_int16 * OPUS_RESTRICTrestrict pcm, int frame_size)
1639{
1640 int j, ret, C, N;
1641 VARDECL(opus_res, out)opus_res *out;
1642 ALLOC_STACK;
1643
1644 if (pcm==NULL((void*)0))
1645 return OPUS_BAD_ARG-1;
1646
1647 C = st->channels;
1648 N = frame_size;
1649
1650 ALLOC(out, C*N, opus_res)out = ((opus_res*)__builtin_alloca (sizeof(opus_res)*(C*N)));
1651 ret = celt_decode_with_ec(st, data, len, out, frame_size, NULL((void*)0), 0);
1652 if (ret>0)
1653 for (j=0;j<C*ret;j++)
1654 pcm[j]=RES2INT16(out[j])FLOAT2INT16(out[j]);
1655
1656 RESTORE_STACK;
1657 return ret;
1658}
1659#endif
1660
1661#if defined(FIXED_POINT) && defined(ENABLE_RES24)
1662int opus_custom_decode24(CELTDecoderOpusCustomDecoder * OPUS_RESTRICTrestrict st, const unsigned char *data, int len, opus_int32 * OPUS_RESTRICTrestrict pcm, int frame_size)
1663{
1664 return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL((void*)0), 0);
1665}
1666#else
1667int opus_custom_decode24(CELTDecoderOpusCustomDecoder * OPUS_RESTRICTrestrict st, const unsigned char *data, int len, opus_int32 * OPUS_RESTRICTrestrict pcm, int frame_size)
1668{
1669 int j, ret, C, N;
1670 VARDECL(opus_res, out)opus_res *out;
1671 ALLOC_STACK;
1672
1673 if (pcm==NULL((void*)0))
1674 return OPUS_BAD_ARG-1;
1675
1676 C = st->channels;
1677 N = frame_size;
1678
1679 ALLOC(out, C*N, opus_res)out = ((opus_res*)__builtin_alloca (sizeof(opus_res)*(C*N)));
1680 ret = celt_decode_with_ec(st, data, len, out, frame_size, NULL((void*)0), 0);
1681 if (ret>0)
1682 for (j=0;j<C*ret;j++)
1683 pcm[j]=RES2INT24(out[j])float2int(32768.f*256.f*(out[j]));
1684
1685 RESTORE_STACK;
1686 return ret;
1687}
1688#endif
1689
1690
1691#ifndef DISABLE_FLOAT_API
1692
1693# if !defined(FIXED_POINT)
1694int opus_custom_decode_float(CELTDecoderOpusCustomDecoder * OPUS_RESTRICTrestrict st, const unsigned char *data, int len, float * OPUS_RESTRICTrestrict pcm, int frame_size)
1695{
1696 return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL((void*)0), 0);
1697}
1698# else
1699int opus_custom_decode_float(CELTDecoderOpusCustomDecoder * OPUS_RESTRICTrestrict st, const unsigned char *data, int len, float * OPUS_RESTRICTrestrict pcm, int frame_size)
1700{
1701 int j, ret, C, N;
1702 VARDECL(opus_res, out)opus_res *out;
1703 ALLOC_STACK;
1704
1705 if (pcm==NULL((void*)0))
1706 return OPUS_BAD_ARG-1;
1707
1708 C = st->channels;
1709 N = frame_size;
1710
1711 ALLOC(out, C*N, opus_res)out = ((opus_res*)__builtin_alloca (sizeof(opus_res)*(C*N)));
1712 ret=celt_decode_with_ec(st, data, len, out, frame_size, NULL((void*)0), 0);
1713 if (ret>0)
1714 for (j=0;j<C*ret;j++)
1715 pcm[j]=RES2FLOAT(out[j])(out[j]);
1716
1717 RESTORE_STACK;
1718 return ret;
1719}
1720# endif
1721
1722#endif
1723
1724#endif /* CUSTOM_MODES */
1725
1726int opus_custom_decoder_ctl(CELTDecoderOpusCustomDecoder * OPUS_RESTRICTrestrict st, int request, ...)
1727{
1728 va_list ap;
1729
1730 va_start(ap, request)__builtin_va_start(ap, request);
1731 switch (request)
1732 {
1733 case OPUS_SET_COMPLEXITY_REQUEST4010:
1734 {
1735 opus_int32 value = va_arg(ap, opus_int32)__builtin_va_arg(ap, opus_int32);
1736 if(value<0 || value>10)
1737 {
1738 goto bad_arg;
1739 }
1740 st->complexity = value;
1741 }
1742 break;
1743 case OPUS_GET_COMPLEXITY_REQUEST4011:
1744 {
1745 opus_int32 *value = va_arg(ap, opus_int32*)__builtin_va_arg(ap, opus_int32*);
1746 if (!value)
1747 {
1748 goto bad_arg;
1749 }
1750 *value = st->complexity;
1751 }
1752 break;
1753 case CELT_SET_START_BAND_REQUEST10010:
1754 {
1755 opus_int32 value = va_arg(ap, opus_int32)__builtin_va_arg(ap, opus_int32);
1756 if (value<0 || value>=st->mode->nbEBands)
1757 goto bad_arg;
1758 st->start = value;
1759 }
1760 break;
1761 case CELT_SET_END_BAND_REQUEST10012:
1762 {
1763 opus_int32 value = va_arg(ap, opus_int32)__builtin_va_arg(ap, opus_int32);
1764 if (value<1 || value>st->mode->nbEBands)
1765 goto bad_arg;
1766 st->end = value;
1767 }
1768 break;
1769 case CELT_SET_CHANNELS_REQUEST10008:
1770 {
1771 opus_int32 value = va_arg(ap, opus_int32)__builtin_va_arg(ap, opus_int32);
1772 if (value<1 || value>2)
1773 goto bad_arg;
1774 st->stream_channels = value;
1775 }
1776 break;
1777 case CELT_GET_AND_CLEAR_ERROR_REQUEST10007:
1778 {
1779 opus_int32 *value = va_arg(ap, opus_int32*)__builtin_va_arg(ap, opus_int32*);
1780 if (value==NULL((void*)0))
1781 goto bad_arg;
1782 *value=st->error;
1783 st->error = 0;
1784 }
1785 break;
1786 case OPUS_GET_LOOKAHEAD_REQUEST4027:
1787 {
1788 opus_int32 *value = va_arg(ap, opus_int32*)__builtin_va_arg(ap, opus_int32*);
1789 if (value==NULL((void*)0))
1790 goto bad_arg;
1791 *value = st->overlap/st->downsample;
1792 }
1793 break;
1794 case OPUS_RESET_STATE4028:
1795 {
1796 int i;
1797 celt_glog *oldBandE, *oldLogE, *oldLogE2;
1798 int decode_buffer_size;
1799#ifdef ENABLE_QEXT
1800 int qext_scale = st->qext_scale;
1801#endif
1802 decode_buffer_size = QEXT_SCALE(DECODE_BUFFER_SIZE)(2048);
1803 oldBandE = (celt_glog*)(st->_decode_mem+(decode_buffer_size+st->overlap)*st->channels);
1804 oldLogE = oldBandE + 2*st->mode->nbEBands;
1805 oldLogE2 = oldLogE + 2*st->mode->nbEBands;
1806 OPUS_CLEAR((char*)&st->DECODER_RESET_START,(memset(((char*)&st->rng), 0, (opus_custom_decoder_get_size
(st->mode, st->channels)- ((char*)&st->rng - (char
*)st))*sizeof(*((char*)&st->rng))))
1807 opus_custom_decoder_get_size(st->mode, st->channels)-(memset(((char*)&st->rng), 0, (opus_custom_decoder_get_size
(st->mode, st->channels)- ((char*)&st->rng - (char
*)st))*sizeof(*((char*)&st->rng))))
1808 ((char*)&st->DECODER_RESET_START - (char*)st))(memset(((char*)&st->rng), 0, (opus_custom_decoder_get_size
(st->mode, st->channels)- ((char*)&st->rng - (char
*)st))*sizeof(*((char*)&st->rng))))
;
1809 for (i=0;i<2*st->mode->nbEBands;i++)
1810 oldLogE[i]=oldLogE2[i]=-GCONST(28.f)(28.f);
1811 st->skip_plc = 1;
1812 st->last_frame_type = FRAME_NONE0;
1813 }
1814 break;
1815 case OPUS_GET_PITCH_REQUEST4033:
1816 {
1817 opus_int32 *value = va_arg(ap, opus_int32*)__builtin_va_arg(ap, opus_int32*);
1818 if (value==NULL((void*)0))
1819 goto bad_arg;
1820 *value = st->postfilter_period;
1821 }
1822 break;
1823 case CELT_GET_MODE_REQUEST10015:
1824 {
1825 const CELTModeOpusCustomMode ** value = va_arg(ap, const CELTMode**)__builtin_va_arg(ap, const OpusCustomMode**);
1826 if (value==0)
1827 goto bad_arg;
1828 *value=st->mode;
1829 }
1830 break;
1831 case CELT_SET_SIGNALLING_REQUEST10016:
1832 {
1833 opus_int32 value = va_arg(ap, opus_int32)__builtin_va_arg(ap, opus_int32);
1834 st->signalling = value;
1835 }
1836 break;
1837 case OPUS_GET_FINAL_RANGE_REQUEST4031:
1838 {
1839 opus_uint32 * value = va_arg(ap, opus_uint32 *)__builtin_va_arg(ap, opus_uint32 *);
1840 if (value==0)
1841 goto bad_arg;
1842 *value=st->rng;
1843 }
1844 break;
1845 case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST4046:
1846 {
1847 opus_int32 value = va_arg(ap, opus_int32)__builtin_va_arg(ap, opus_int32);
1848 if(value<0 || value>1)
1849 {
1850 goto bad_arg;
1851 }
1852 st->disable_inv = value;
1853 }
1854 break;
1855 case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST4047:
1856 {
1857 opus_int32 *value = va_arg(ap, opus_int32*)__builtin_va_arg(ap, opus_int32*);
1858 if (!value)
1859 {
1860 goto bad_arg;
1861 }
1862 *value = st->disable_inv;
1863 }
1864 break;
1865 default:
1866 goto bad_request;
1867 }
1868 va_end(ap)__builtin_va_end(ap);
1869 return OPUS_OK0;
1870bad_arg:
1871 va_end(ap)__builtin_va_end(ap);
1872 return OPUS_BAD_ARG-1;
1873bad_request:
1874 va_end(ap)__builtin_va_end(ap);
1875 return OPUS_UNIMPLEMENTED-5;
1876}