FreeCalypso > hg > gsm-codec-lib
annotate doc/AMR-EFR-performance @ 514:67b13a6a63c9
libgsmhr1: implement validation for *.dec frames
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 25 Aug 2024 19:14:40 +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. |