annotate libtwamr/dec_main.c @ 585:3c6bf0d26ee7 default tip

TW-TS-005 reader: fix maximum line length bug TW-TS-005 section 4.1 states: The maximum allowed length of each line is 80 characters, not including the OS-specific newline encoding. The implementation of this line length limit in the TW-TS-005 hex file reader function in the present suite was wrong, such that lines of the full maximum length could not be read. Fix it. Note that this bug affects comment lines too, not just actual RTP payloads. Neither Annex A nor Annex B features an RTP payload format that goes to the maximum of 40 bytes, but if a comment line goes to the maximum allowed length of 80 characters not including the terminating newline, the bug will be triggered, necessitating the present fix.
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 25 Feb 2025 07:49:28 +0000
parents 357d1faad55d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
419
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
427
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
2 * This C module is the top level entity for our stateful decoder engine.
419
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 */
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 #include <stdint.h>
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 #include <stdlib.h>
427
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
7 #include <string.h>
419
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 #include "tw_amr.h"
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 #include "namespace.h"
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 #include "typedef.h"
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 #include "cnst.h"
427
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
12 #include "dec_amr.h"
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
13 #include "pstfilt.h"
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
14 #include "post_pro.h"
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
15 #include "bitno.h"
419
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16
427
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
17 struct amr_decoder_state {
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
18 Decoder_amrState dec;
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
19 Post_FilterState pstfilt;
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
20 Post_ProcessState posthp;
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
21 enum Mode prev_mode;
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
22 Flag is_homed;
419
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 };
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24
427
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
25 struct amr_decoder_state *amr_decoder_create(void)
419
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 {
427
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
27 struct amr_decoder_state *st;
419
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28
427
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
29 st = malloc(sizeof(struct amr_decoder_state));
419
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 if (st)
427
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
31 amr_decoder_reset(st);
419
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 return st;
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 }
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34
427
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
35 void amr_decoder_reset(struct amr_decoder_state *st)
419
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 {
427
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
37 Decoder_amr_reset(&st->dec, 0);
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
38 Post_Filter_reset(&st->pstfilt);
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
39 Post_Process_reset(&st->posthp);
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
40 st->prev_mode = (enum Mode) 0;
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
41 st->is_homed = 1;
419
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 }
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43
427
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
44 void amr_decode_frame(struct amr_decoder_state *st,
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
45 const struct amr_param_frame *frame, int16_t *pcm)
419
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 {
427
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
47 enum Mode mode;
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
48 Word16 parm[MAX_PRM_SIZE];
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
49 Word16 Az_dec[AZ_SIZE];
419
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 Word16 i;
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51
427
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
52 /* fast home state handling needs to be first */
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
53 if (st->is_homed && amr_check_dhf(frame, 1)) {
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
54 for (i = 0; i < L_FRAME; i++)
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
55 pcm[i] = EHF_MASK;
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
56 return;
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
57 }
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
58 /* "unpack" into internal form */
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
59 if (frame->type == RX_NO_DATA)
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
60 mode = st->prev_mode;
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
61 else {
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
62 mode = frame->mode & 7;
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
63 st->prev_mode = mode;
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
64 }
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
65 memcpy(parm, frame->param, prmno[mode] * sizeof(int16_t));
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
66 /* now we can call the guts of the decoder */
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
67 Decoder_amr(&st->dec, mode, parm, frame->type, pcm, Az_dec);
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
68 Post_Filter(&st->pstfilt, mode, pcm, Az_dec);
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
69 Post_Process(&st->posthp, pcm, L_FRAME);
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
70 /*
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
71 * The 3 lsbs of each speech sample typically won't be all 0
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
72 * out of Post_Process(), hence we have to clear them explicitly
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
73 * to maintain overall bit-exact operation.
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
74 */
419
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 for (i = 0; i < L_FRAME; i++)
427
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
76 pcm[i] &= 0xFFF8;
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
77 /* final check for full DHF */
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
78 if (amr_check_dhf(frame, 0))
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
79 amr_decoder_reset(st);
419
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 else
427
357d1faad55d libtwamr: implement decoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents: 419
diff changeset
81 st->is_homed = 0;
419
2a094af3d384 libtwamr: implement encoder top level
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 }