FreeCalypso > hg > gsm-codec-lib
annotate doc/AMR-EFR-performance @ 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 | cd1f0fa936cc |
children |
rev | line source |
---|---|
487
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 Performance of libgsmefr and libtwamr, compared to competition |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 ============================================================== |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 Both libgsmefr and libtwamr are based on reference C code from ETSI/3GPP: |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 libgsmefr is a librified version of GSM 06.53 reference code, and libtwamr is a |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 librified version of TS 26.073 reference code. Both of those reference sources |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 were officially presented as simulations, not as production code for running on |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 general-purpose x86 servers implementing transcoding MGW functionality, and the |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 code is extremely inefficient. |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 The problem of poor performance (taking too much CPU percentage per transcoded |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 call) would not be so acute if Themyscira GSM codec libraries existed in a |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 vacuum without competition - but we do have a competitor in the form of |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 libopencore-amrnb, part of the slightly larger opencore-amr package. Just like |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 libtwamr, that library is a derivative work based on the original AMR C code |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 from 3GPP, but by a more circuitous route: first PacketVideo created an |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 implementation of AMR for Android based on 3GPP reference code, then the |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 creators of opencore-amr took PV's Android implementation (named OpenCORE) and |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 ported it from Android to standard Unix/Linux userspace. |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 Aside from its peculiar genealogy, there are practical problems with |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 libopencore-amrnb that made it unattractive for Themyscira Wireless, and thus |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 created the impetus for producing the present alternative: |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 * That library implements only AMR and not EFR, whereas for ThemWi good support |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 for EFR is a higher priority than good (or any) support for AMR. |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 * The idea of reshuffling bits in the manner of our gsm-amr2efr and gsm-efr2amr |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 hack-utilities (see AMR-EFR-conversion article) in order to implement "poor |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 man's EFR" via libopencore-amrnb was considered, but then rejected on |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 philosophical and aesthetic grounds: it feels philosophically wrong to |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 reshuffle bits in the application wrapper only to have internal code within |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 the library shuffle them back into the natural order of codec parameters. |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 * Like any AMR-and-not-EFR library, libopencore-amrnb cannot grok EFR SID |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 frames. Therefore, an implementation of "poor man's EFR" using that library |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 would have to operate with DTXu disabled, needlessly burning battery capacity |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 in the MS. |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 * Even for "pure" AMR and not EFR, libopencore-amrnb exhibits one serious |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 defect: it omits the in-band homing feature in both the encoder and the |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 decoder, even though this feature is mandatory per 3GPP specs. (It is not |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 clear if this removal of homing functions was the work of PacketVideo in the |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 world of Android, or if it happened at the time of subsequent opencore-amr |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 port to standard Unix/Linux userspace.) Furthermore, because the interface |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 wrapper module of libopencore-amrnb does not expose any state reset functions, |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 it is impossible to implement the homing feature externally to the library. |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 This lack of homing makes it impossible to test libopencore-amrnb against the |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 full set of 3GPP test sequences for AMR. |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 In the present time, as of this release of Themyscira gsm-codec-lib, libgsmefr |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 is intended for production use while libtwamr is intended for lab use only, |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 matching test sequences and modeling bit-exact operation of other people's |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 network elements in reverse engineering workflows. Based on this difference in |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 applicability to production, more work has been put into improving performance |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 of libgsmefr compared to libtwamr. Libgsmefr version 1.1.0 exhibits |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 approximately 2x performance improvement over the original version, but it is |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 still significantly slower than libopencore-amrnb. |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 The following performance numbers were obtained on Mother Mychaela's development |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 laptop, Intel Core2 Duo P8600 CPU @ 2.40 GHz, running 32-bit version of |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 Slackware, i.e., running only i686 code and not x86_64 despite the CPU having |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 the 'lm' feature. All tests involve encoding TEST4.INP sequence from GSM 06.54 |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 set (301 frames in total, 6.020 s audio duration), then decoding the output of |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 the encoder run. |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 Implementation Encoding time Decoding time |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 --------------------------------------------- |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 libgsmefr 183 ms 23 ms |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 libtwamr 359 ms 52 ms |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 opencore-amr 53 ms 13 ms |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 libgsmfr2 (FR) 13 ms 6 ms |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 FRv1 encoding and decoding of the same TEST4.INP was included in the test in |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 order to convince ourselves that FRv1 is not in any need of performance |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 optimization. In a network deployment that generally prefers EFR over FRv1, |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 almost all calls between a local GSM MS and the outside world (PSTN) will |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 involve the EFR transcoder rather than FRv1. If on rare occasion the network |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 selects FRv1 instead of EFR because the subscriber is using a super-old |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 non-EFR-capable handset (or has artificially restricted the speech version list |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 to FRv1 only), there will be some CPU cycles saved "for free" by using the much |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 less computationally expensive FRv1 codec - but CPU capacity planning for the |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 transcoding MGW has to be based on EFR performance numbers rather than FRv1. |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 In terms of EFR or MR122 encoder and decoder CPU cycle demand, libtwamr is |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 currently the worst performer; the first version of libgsmefr exhibited the |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 same poor performance. The current version of libgsmefr exhibits somewhat |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 better performance because most saturation arithmetic "basic ops" have been |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 inlined (eliminating the use of a function call for every elementary operation), |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 and the implementation code of those newly-inlined functions has been |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 streamlined for performance, as much as possible with immediately obvious |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 programming methods. The result is about 2x improvement over the original - |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 but sadly, still significantly slower than libopencore-amrnb on the same |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 machine with the same 32-bit execution mode and ABI. |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 Given that we (Themyscira Wireless) have a ton of other work tasks in our queue |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 besides the present problem of performance-optimizing libgsmefr to match |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 opencore-amr, this problem is currently shelved. We are releasing our libraries |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 as they currently stand, with the ~2x improvement in libgsmefr over the original |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 but still not matching opencore-amr, and leaving the problem of further |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 performance improvement to be addressed later, after other work of higher |
cd1f0fa936cc
doc/AMR-EFR-performance: new article
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 priority. |