FreeCalypso > hg > gsm-codec-lib
view libtwamr/pre_big.c @ 477:4c9222d95647
libtwamr encoder: always emit frame->mode = mode;
In the original implementation of amr_encode_frame(), the 'mode' member
of the output struct was set to 0xFF if the output frame type is TX_NO_DATA.
This design was made to mimic the mode field (16-bit word) being set to
0xFFFF (or -1) in 3GPP test sequence format - but nothing actually depends
on this struct member being set in any way, and amr_frame_to_tseq()
generates the needed 0xFFFF on its own, based on frame->type being equal
to TX_NO_DATA.
It is simpler and more efficient to always set frame->mode to the actual
encoding mode in amr_encode_frame(), and this new behavior has already
been documented in doc/AMR-library-API description in anticipation of
the present change.
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Sat, 18 May 2024 22:30:42 +0000 |
| parents | 38ee82480462 |
| children |
line wrap: on
line source
/* ******************************************************************************** * * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001 * R99 Version 3.3.0 * REL-4 Version 4.1.0 * ******************************************************************************** * * File : pre_big.c * Purpose : Big subframe (2 subframes) preprocessing * ******************************************************************************** */ /* ******************************************************************************** * MODULE INCLUDE FILE AND VERSION ID ******************************************************************************** */ #include "namespace.h" #include "pre_big.h" /* ******************************************************************************** * INCLUDE FILES ******************************************************************************** */ #include "typedef.h" #include "basic_op.h" #include "oper_32b.h" #include "syn_filt.h" #include "weight_a.h" #include "residu.h" #include "no_count.h" #include "cnst.h" /* ******************************************************************************** * PUBLIC PROGRAM CODE ******************************************************************************** */ int pre_big( enum Mode mode, /* i : coder mode */ const Word16 gamma1[], /* i : spectral exp. factor 1 */ const Word16 gamma1_12k2[],/* i : spectral exp. factor 1 for EFR */ const Word16 gamma2[], /* i : spectral exp. factor 2 */ Word16 A_t[], /* i : A(z) unquantized, for 4 subframes, Q12 */ Word16 frameOffset, /* i : Start position in speech vector, Q0 */ Word16 speech[], /* i : speech, Q0 */ Word16 mem_w[], /* i/o: synthesis filter memory state, Q0 */ Word16 wsp[] /* o : weighted speech Q0 */ ) { Word16 Ap1[MP1]; /* A(z) with spectral expansion */ Word16 Ap2[MP1]; /* A(z) with spectral expansion */ const Word16 *g1; /* Pointer to correct gammma1 vector */ Word16 aOffset; Word16 i; test (); if (sub (mode, MR795) <= 0 ) { g1 = gamma1; move16 (); } else { g1 = gamma1_12k2; move16 (); } test (); if (frameOffset > 0) { aOffset = 2*MP1; move16 (); } else { aOffset = 0; move16 (); } /* process two subframes (which form the "big" subframe) */ for (i = 0; i < 2; i++) { Weight_Ai(&A_t[aOffset], g1, Ap1); Weight_Ai(&A_t[aOffset], gamma2, Ap2); Residu(Ap1, &speech[frameOffset], &wsp[frameOffset], L_SUBFR); Syn_filt(Ap2, &wsp[frameOffset], &wsp[frameOffset], L_SUBFR, mem_w, 1); aOffset = add (aOffset, MP1); frameOffset = add (frameOffset, L_SUBFR); } return 0; }
