annotate doc/AMR-library-API @ 490:4d80730683d4

libgsmhr1: implement TS 101 318 packing and unpacking
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 15 Jun 2024 05:33:35 +0000
parents 332397bc80aa
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
476
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 Libtwamr general usage
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 ======================
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 The external public interface to Themyscira libtwamr consists of a single
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 header file <tw_amr.h>; it should be installed in some system include
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 directory.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 The dialect of C used by all Themyscira GSM codec libraries is ANSI C (function
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 prototypes), const qualifier is used where appropriate, and the interface is
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 defined in terms of <stdint.h> types; <tw_amr.h> includes <stdint.h>.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 Public #define constant definitions
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 ===================================
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 Libtwamr public API header file <tw_amr.h> defines these constants:
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 #define AMR_MAX_PRM 57 /* max. num. of params */
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 #define AMR_IETF_MAX_PL 32 /* max bytes in RFC 4867 frame */
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 #define AMR_IETF_HDR_LEN 6 /* .amr file header bytes */
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 #define AMR_COD_WORDS 250 /* # of words in 3GPP test seq format */
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 Explanation:
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 * AMR_MAX_PRM is the maximum number of broken-down speech parameters in the
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 highest 12k2 mode of AMR; this definition is needed for struct amr_param_frame
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 covered later in this document.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 * AMR_IETF_MAX_PL is the size of the output buffer that must be provided for
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 amr_frame_to_ietf(), and also most commonly the size of the staging buffer
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 which most applications will likely use for gathering the input to
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 amr_frame_from_ietf().
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 * AMR_IETF_HDR_LEN is the size of amr_file_header_magic[] public const datum
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 covered later in this document, and this constant will also be needed by any
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 application that needs to read or write the fixed header at the beginning of
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 .amr files.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 * AMR_COD_WORDS is the number of 16-bit words in one encoded frame in 3GPP test
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 sequence format (.cod); the public definition is needed for sizing the arrays
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 used with amr_frame_to_tseq() and amr_frame_from_tseq() API functions.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 Libtwamr enumerated types
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 =========================
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 Libtwamr public API header file <tw_amr.h> defines these 3 enums:
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 enum RXFrameType {
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 RX_SPEECH_GOOD = 0,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 RX_SPEECH_DEGRADED,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 RX_ONSET,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 RX_SPEECH_BAD,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 RX_SID_FIRST,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 RX_SID_UPDATE,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 RX_SID_BAD,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 RX_NO_DATA,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 RX_N_FRAMETYPES /* number of frame types */
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 };
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 enum TXFrameType {
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 TX_SPEECH_GOOD = 0,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 TX_SID_FIRST,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 TX_SID_UPDATE,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 TX_NO_DATA,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 TX_SPEECH_DEGRADED,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 TX_SPEECH_BAD,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 TX_SID_BAD,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 TX_ONSET,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 TX_N_FRAMETYPES /* number of frame types */
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 };
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 enum Mode {
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 MR475 = 0,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 MR515,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 MR59,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 MR67,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 MR74,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 MR795,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 MR102,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 MR122,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 MRDTX
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 };
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 Rx and Tx frame types are as defined by 3GPP, and the numeric values assigned
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 to each type are the same as those used by the official TS 26.073 encoder and
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 decoder programs. Note that Rx and Tx frame types are NOT equal!
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 enum Mode should be self-explanatory: it covers the 8 possible codec modes of
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 AMR, plus the pseudo-mode of MRDTX used for packing and format manipulation of
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 SID frames.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 State allocation and freeing
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 ============================
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 In order to use the AMR encoder, you will need to allocate an encoder state
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 structure, and to use the AMR decoder, you will need to allocate a decoder state
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 structure. The necessary state allocation functions are:
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 struct amr_encoder_state *amr_encoder_create(int dtx, int use_vad2);
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 struct amr_decoder_state *amr_decoder_create(void);
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 struct amr_encoder_state and struct amr_decoder_state are opaque structures to
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 library users: you only get pointers which you remember and pass around, but
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 <tw_amr.h> does not give you full definitions of these structs. As a library
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 user, you don't even get to know the size of these structs, hence the necessary
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 malloc() operation happens inside amr_encoder_create() and amr_decoder_create().
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 However, each structure is malloc'ed as a single chunk, hence when you are done
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 with it, simply call free() to relinquish each encoder or decoder state
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 instance.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 amr_encoder_create() and amr_decoder_create() functions can fail if the malloc()
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 call inside fails, in which case the two libtwamr functions in question return
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 NULL.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 The dtx argument to amr_encoder_create() is a Boolean flag represented as an
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 int; it tells the AMR encoder whether it should operate with DTX enabled or
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 disabled. (Note that DTX is also called SCR for Source-Controlled Rate in some
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 AMR specs.) The use_vad2 argument is another Boolean flag, also represented as
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 an int; it tells the AMR encoder to use VAD2 algorithm instead of VAD1. It is
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 a novel feature of libtwamr in that both VAD versions are included and
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 selectable at run time; see AMR-library-desc article for the details.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 State reset functions
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123 ---------------------
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125 The state of an already-allocated AMR encoder or AMR decoder can be reset at
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 any time with these functions:
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128 void amr_encoder_reset(struct amr_encoder_state *st, int dtx, int use_vad2);
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129 void amr_decoder_reset(struct amr_decoder_state *st);
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131 Note that the two extra arguments to amr_encoder_reset() are the same as the
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 arguments to amr_encoder_create() - the reset operation is complete.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133 amr_encoder_create() is a wrapper around malloc() followed by
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134 amr_encoder_reset(), and amr_decoder_create() is a wrapper around malloc()
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135 followed by amr_decoder_reset().
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137 Using the AMR encoder
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138 =====================
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140 To encode one 20 ms audio frame per AMR, call amr_encode_frame():
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 void amr_encode_frame(struct amr_encoder_state *st, enum Mode mode,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143 const int16_t *pcm, struct amr_param_frame *frame);
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
145 You need to provide an encoder state structure allocated earlier with
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146 amr_encoder_create(), the selection of which codec mode to use, and a block of
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147 160 linear PCM samples. Only modes MR475 through MR122 are valid for 'mode'
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148 argument to amr_encode_frame(); MRDTX is not allowed in this context.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150 The output from amr_encode_frame() is written into this structure:
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
152 struct amr_param_frame {
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
153 uint8_t type;
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
154 uint8_t mode;
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155 int16_t param[AMR_MAX_PRM];
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156 };
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 This structure is public, but it is defined by libtwamr (not by any external
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 standard), and it is generally intended to be an intermediate stage before
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160 output encoding. Library functions exist for generating 3 output formats: 3GPP
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 AMR test sequence format, IETF RFC 4867 format, and AMR-EFR hybrid.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163 Native encoder output
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164 ---------------------
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166 The output structure is filled as follows:
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
168 type: Set to one of TX_SPEECH_GOOD, TX_SID_FIRST, TX_SID_UPDATE or TX_NO_DATA,
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169 as defined by 3GPP. The last 3 are possible only when the encoder
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170 operates with DTX enabled.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
171
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172 mode: One of MR475 through MR122, same as the 'mode' argument to
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173 amr_encode_frame().
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175 param: Array of codec parameters, from 17 to 57 of them for modes MR475 through
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 MR122 in the case of TX_SPEECH_GOOD output, or 5 parameters for MRDTX
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
177 in the case of TX_SID_FIRST, TX_SID_UPDATE or TX_NO_DATA DTX output.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 3GPP AMR test sequence output
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
180 -----------------------------
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
181
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
182 The following function exists to convert the above encoder output into the test
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
183 sequence format which 3GPP defined for AMR, the insanely inefficient one with
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
184 250 (AMR_COD_WORDS) 16-bit words per frame:
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
185
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
186 void amr_frame_to_tseq(const struct amr_param_frame *frame, uint16_t *cod);
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
188 This function allows libtwamr encoder to be tested for correctness against the
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
189 set of test sequences in 3GPP TS 26.074. The output is in the local machine's
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190 native byte order.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
192 RFC 4867 output
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
193 ---------------
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
194
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
195 To turn libtwamr encoder output into an octet-aligned RFC 4867 single-frame
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
196 payload or storage-format frame (ToC octet followed by speech or SID data, but
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
197 no CMR payload header), call this function:
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
198
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199 unsigned amr_frame_to_ietf(const struct amr_param_frame *frame, uint8_t *bytes);
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
200
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
201 The output buffer must have room for up to 32 bytes (AMR_IETF_MAX_PL); the
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
202 return value is the actual number of bytes used. The shortest possible output
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
203 is 1 byte in the case of TX_NO_DATA; the longest possible output is 32 bytes in
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
204 the case of TX_SPEECH_GOOD, mode MR122.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
205
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
206 Additional notes regarding output conversion functions
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
207 ------------------------------------------------------
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
208
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
209 The struct amr_param_frame that is input to amr_frame_to_ietf() or
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
210 amr_frame_to_tseq() is expected to be a valid output from amr_encode_frame().
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
211 These output conversion functions contain no guards against invalid input
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
212 (anything that cannot occur in the output from amr_encode_frame()), and are
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
213 thus allowed to segfault or corrupt memory etc if fed such invalid input.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
214
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
215 This lack of guard is justified in the present instance because struct
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
216 amr_param_frame is not intended to ever function as an external interface to
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
217 untrusted entities, instead this struct is intended to be only an intermediate
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
218 staging buffer between the call to amr_encode_frame() and an immediately
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
219 following call to one of the provided output conversion functions.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
220
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
221 AMR-EFR hybrid encoder
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
222 ======================
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
223
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
224 To use libtwamr as an AMR-EFR hybrid encoder, follow these constraints:
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
225
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
226 * 'dtx' argument must be 0 (no DTX) on the call to amr_encoder_create() or
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
227 amr_encoder_reset() that establishes the state for the encoder session.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
228
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
229 * 'mode' argument to amr_encode_frame() must be MR122 on every frame.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
230
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
231 After getting struct amr_param_frame out of amr_encode_frame(), call one of
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
232 these functions to generate the correct EFR DHF under the right conditions:
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
233
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
234 void amr_dhf_subst_efr(struct amr_param_frame *frame);
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
235 void amr_dhf_subst_efr2(struct amr_param_frame *frame, const int16_t *pcm);
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
236
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
237 Both functions check if the encoded frame is MR122 DHF (type equals
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
238 TX_SPEECH_GOOD, mode equals MR122, param array equals the fixed bit pattern of
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
239 MR122 DHF), and if so, overwrite param[] array in the structure with the
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
240 different bit pattern of EFR DHF. The difference between the two functions is
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
241 that amr_dhf_subst_efr() performs the just-described substitution
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
242 unconditionally, whereas amr_dhf_subst_efr2() applies this substitution only if
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
243 the PCM input is EHF. The latter function matches the observed behavior of
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
244 T-Mobile USA, but perhaps some others implemented the simpler logic equivalent
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
245 to our first function.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
246
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
247 After this transformation, call EFR_params2frame() from libgsmefr (see
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
248 EFR-library-API) with param[] array in struct amr_param_frame as input.
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
249
478
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
250 Using the AMR decoder: native interface
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
251 =======================================
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
252
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
253 The internal native form of the stateful AMR decoder engine is:
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
254
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
255 void amr_decode_frame(struct amr_decoder_state *st,
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
256 const struct amr_param_frame *frame, int16_t *pcm);
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
257
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
258 The input frame is given as struct amr_param_frame, same structure as is used
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
259 for the output of the encoder. However, the required input to
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
260 amr_decode_frame() is different from amr_encode_frame() output:
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
261
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
262 * The 'type' member of the struct must be a code from enum RXFrameType, *not*
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
263 enum TXFrameType!
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
264
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
265 * All 3GPP-defined Rx frame types are allowed.
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
266
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
267 * The 'mode' member of the input struct is ignored if the Rx frame type is
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
268 RX_NO_DATA, but must be valid for every other frame type.
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
269
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
270 If frame->type is not RX_NO_DATA, frame->mode is interpreted as follows:
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
271
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
272 * The 3 least significant bits (mask 0x07) are taken to indicate the codec mode
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
273 used for this frame;
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
274
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
275 * The most significant bit (mask 0x80) has meaning only if the mode is MR122
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
276 and frame->type is RX_SPEECH_GOOD. Under these conditions, if this bit is
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
277 set, the DHF check is modified to match against the bit pattern of EFR DHF
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
278 instead of regular MR122 DHF.
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
279
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
280 amr_decode_frame() contains no guards against invalid (undefined) frame types
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
281 in frame->type, or against any of the codec parameters being out of range.
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
282 struct amr_param_frame coming into this function must come only from trusted
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
283 sources inside the application program, usually from one of the provided input
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
284 format conversion functions.
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
285
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
286 Decoder homing frame check
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
287 --------------------------
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
288
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
289 The definition of AMR decoder per 3GPP includes two mandatory checks for the
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
290 possibility of the input frame being one of the defined per-mode decoder homing
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
291 frames (DHFs): one check at the beginning of the decoder, checking only up to
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
292 the first subframe and acting only when the current state is homed, and the
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
293 second check at the end of the decoder, checking all parameters (the full frame)
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
294 and resetting the decoder on match.
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
295
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
296 This DHF check operation, called from those two places in the stateful decoder
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
297 as just described, is factored out into its own function that is exported as
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
298 part of the public API:
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
299
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
300 int amr_check_dhf(const struct amr_param_frame *frame, int first_sub_only);
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
301
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
302 struct amr_param_frame needs to be passed to amr_check_dhf() as if it was
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
303 amr_decode_frame(); the latter function in fact calls amr_check_dhf() on its
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
304 input. The Boolean flag argument (first_sub_only) tells the function to check
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
305 only to the end of the first subframe if nonzero, or check the entire frame if
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
306 zero. The return value is 1 if the input matches DHF, 0 otherwise.
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
307
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
308 frame->type must be RX_SPEECH_GOOD for the frame to be a DHF candidate, and the
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
309 interpretation of frame->mode, including the special mode of matching against
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
310 EFR DHF, is implemented in this function.
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
311
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
312 Using the AMR decoder: input preparation
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
313 ========================================
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
314
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
315 Stateless utility functions are provided for preparing decoder inputs,
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
316 converting from RFC 4867 or 3GPP test sequence format into the internal form
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
317 described above.
476
c84bf526c7eb beginning of libtwamr documentation
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
318
478
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
319 Decoding RFC 4867 input
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
320 -----------------------
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
321
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
322 If the entire RFC 4867 frame (read from .amr storage format or received in RTP
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
323 as an octet-aligned payload) is already in memory, decode it with this function:
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
324
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
325 int amr_frame_from_ietf(const uint8_t *bytes, struct amr_param_frame *frame);
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
326
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
327 The string of bytes input to this function must begin with the ToC octet. Out
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
328 of this ToC octet, only bits falling under the mask 0x7C (FT and Q bit fields)
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
329 are checked. The remaining 3 bits are not checked: in the case of .amr storage
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
330 format, RFC 4867 describes these bits as "padding" (P bits) and stipulates that
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
331 they MUST be ignored by readers. However, in the case of RTP payloads received
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
332 in a live session, the uppermost bit of the ToC octet becomes F rather than P,
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
333 and it is the responsibility of the application to ensure that F=0: multiframe
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
334 payloads are NOT supported.
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
335
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
336 FT in the input frame may be [0,7] (MR475 through MR122), 8 (MRDTX) or 15
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
337 (AMR_FT_NODATA). In all of these cases amr_frame_from_ietf() succeeds and
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
338 returns 0 to indicate so; the resulting struct amr_param_frame is then good to
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
339 be passed to amr_decode_frame(). OTOH, if FT falls into the invalid range of
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
340 [9,14], amr_frame_from_ietf() returns -1 to indicate invalid input.
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
341
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
342 Applications that read from a .amr file will need to read just the ToC (aka
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
343 frame header) octet and decode it to determine how many additional octets need
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
344 to be read to absorb one frame. Similarly, RTP applications may need to
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
345 validate incoming payloada by cross-checking between the FT indicated in the
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
346 ToC octet and the received payload length. Both applications can use this
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
347 function:
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
348
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
349 int amr_ietf_grok_first_octet(uint8_t fo);
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
350
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
351 The argument is the first octet, and the function only considers the FT field
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
352 thereof. The return value is:
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
353
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
354 -1 for invalid FT [9,14]
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
355 0 for FT=15 (the ToC octet is the entirety of the payload)
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
356 >0 for valid FT [0,8], indicating the number of additional bytes to be read
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
357
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
358 Decoding 3GPP test sequence input
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
359 ---------------------------------
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
360
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
361 To decode a frame from 3GPP .cod file format, call this function:
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
362
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
363 int amr_frame_from_tseq(const uint16_t *cod, int use_rxtype,
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
364 struct amr_param_frame *frame);
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
365
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
366 The argument 'use_rxtype' should be 1 if the input uses Rx frame types (enum
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
367 RXFrameType) or 0 if it uses Tx frame types (enum TXFrameType); this argument
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
368 directly corresponds to -rxframetype command line option in the reference
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
369 decoder program from 3GPP.
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
370
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
371 Unlike raw amr_decode_frame(), amr_frame_from_tseq() does guard against invalid
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
372 input. The return value from this function is:
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
373
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
374 0 means the input was good and the output is good to pass to amr_decode_frame();
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
375 -1 means the frame type field in the input is invalid;
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
376 -2 means the mode field in the input is invalid.
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
377
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
378 Frame type conversion
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
379 ---------------------
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
380
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
381 The operation of mapping from enum TXFrameType to enum RXFrameType, optionally
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
382 but very commonly invoked from amr_frame_from_tseq(), is factored out into its
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
383 own function, exported as part of the public API:
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
384
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
385 int amr_txtype_to_rxtype(enum TXFrameType tx_type, enum RXFrameType *rx_type);
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
386
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
387 The return value is 0 if tx_type is valid and *rx_type has been filled
936a08cc73ce doc/AMR-library-API: describe the decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 476
diff changeset
388 accordingly, or -1 if tx_type is invalid.
479
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
389
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
390 AMR-EFR hybrid decoder
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
391 ======================
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
392
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
393 To use libtwamr as an AMR-EFR hybrid decoder, follow these steps:
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
394
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
395 * Turn the input frame from EFR RTP format into array-of-parameters form with
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
396 libgsmefr function EFR_frame2params(), writing the output into the param[]
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
397 array in struct amr_param_frame.
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
398
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
399 * Set 'type' in the struct to RX_SPEECH_GOOD for good frames, RX_SPEECH_BAD for
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
400 BFI with payload bits present, or RX_NO_DATA for BFI without payload.
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
401
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
402 * Set 'mode' to 0x87 always, indicating a variation of MR122 with EFR DHF
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
403 instead of the different native MR122 DHF.
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
404
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
405 * Call amr_decode_frame() with this input.
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
406
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
407 Fundamental limitation: the AMR decoder in libtwamr, derived from 3GPP AMR
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
408 reference source and only minimally extended to support EFR DHF, does not
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
409 support EFR SID frames. Therefore, the option of AMR-EFR hybrid emulation via
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
410 libtwamr is limited to lab experiments where the input to the decoder can be
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
411 ensured to be SID-free, and is not suitable for production use. See
616b7ba1135b doc/AMR-library-API: document AMR-EFR hybrid decoder
Mychaela Falconia <falcon@freecalypso.org>
parents: 478
diff changeset
412 AMR-EFR-philosophy article for more information.
480
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
413
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
414 Public const data items
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
415 =======================
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
416
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
417 In addition to all of the functions described above, libtwamr exports some
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
418 public const data items, declared in <tw_amr.h> header file.
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
419
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
420 AMR storage format file header
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
421 ------------------------------
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
422
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
423 Every .amr file begins with the magic signature "#!AMR\n" (6 bytes); programs
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
424 that read this file format have to check and skip this signature, whereas
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
425 programs that write this file format have to emit it at the beginning. Libtwamr
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
426 provides both the const datum and its length:
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
427
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
428 #define AMR_IETF_HDR_LEN 6 /* .amr file header bytes */
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
429
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
430 extern const uint8_t amr_file_header_magic[AMR_IETF_HDR_LEN];
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
431
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
432 DHF bit patterns
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
433 ----------------
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
434
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
435 There are 8 special decoder homing frames (DHFs) defined in 3GPP TS 26.073, one
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
436 for each codec mode; libtwamr implements all 8 AMR DHFs plus the different DHF
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
437 defined for EFR. The bit patterns of all 9 DHFs implemented in libtwamr are
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
438 exported as public const data items:
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
439
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
440 extern const int16_t amr_dhf_mr475[AMR_MAX_PRM];
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
441 extern const int16_t amr_dhf_mr515[AMR_MAX_PRM];
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
442 extern const int16_t amr_dhf_mr59[AMR_MAX_PRM];
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
443 extern const int16_t amr_dhf_mr67[AMR_MAX_PRM];
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
444 extern const int16_t amr_dhf_mr74[AMR_MAX_PRM];
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
445 extern const int16_t amr_dhf_mr795[AMR_MAX_PRM];
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
446 extern const int16_t amr_dhf_mr102[AMR_MAX_PRM];
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
447 extern const int16_t amr_dhf_mr122[AMR_MAX_PRM];
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
448 extern const int16_t amr_dhf_gsmefr[AMR_MAX_PRM];
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
449
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
450 Each DHF bit pattern is implemented and exported in the form of an array of
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
451 broken-down codec parameters for its respective mode. For extra robustness,
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
452 each of these const int16_t arrays is storage-allocated in the full size of
332397bc80aa doc/AMR-library-API: document public const data items
Mychaela Falconia <falcon@freecalypso.org>
parents: 479
diff changeset
453 AMR_MAX_PRM (57), even for lower codec modes that have fewer parameters.