FreeCalypso > hg > gsm-codec-lib
comparison doc/AMR-library-desc @ 476:c84bf526c7eb
beginning of libtwamr documentation
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Sat, 18 May 2024 21:22:07 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 475:e512f0d25409 | 476:c84bf526c7eb |
|---|---|
| 1 Themyscira libtwamr general description | |
| 2 ======================================= | |
| 3 | |
| 4 Libtwamr is a librification of the official AMR reference C code from 3GPP, | |
| 5 produced by Themyscira Wireless and styled to match our libraries for more | |
| 6 classic GSM codecs. This library has been created with the following two goals | |
| 7 in mind: | |
| 8 | |
| 9 1) At the present time we (ThemWi) operate our GSM network with only GSM-FR and | |
| 10 GSM-EFR codecs, with the latter being preferred. We do not currently operate | |
| 11 with AMR because the conditions under which AMR becomes advantageous do not | |
| 12 currently exist in our network operation. However, we need to be prepared | |
| 13 for the possibility that the conditions which make AMR desirable may arise | |
| 14 some day, and we may need to start deploying AMR. In order to make AMR | |
| 15 deployment a possibility, many parts will need to be implemented, one of | |
| 16 which is a speech transcoding library that implements the AMR codec in the | |
| 17 same way how libgsmfr2 and libgsmefr implement the more classic codecs which | |
| 18 we use currently. | |
| 19 | |
| 20 2) Many other commercial GSM networks have implemented EFR speech service using | |
| 21 a type of AMR-EFR hybrid described in AMR-EFR-philosophy and | |
| 22 AMR-EFR-hybrid-emu articles. As part of certain behavioral reverse | |
| 23 engineering experiments, we sometimes need to model the bit-exact operation | |
| 24 of those other-people-controlled commercial implementations of AMR-EFR, and | |
| 25 our current libtwamr provides one way to do so. Knowing that a proper | |
| 26 implementation of an AMR codec library is likely to be needed some day for | |
| 27 reason 1 above, justification was obtained for expending the effort to | |
| 28 produce the present libtwamr. | |
| 29 | |
| 30 Compared to other plausible ways in which someone could reasonably approach the | |
| 31 task of librifying the AMR reference code from 3GPP, the design of libtwamr | |
| 32 includes two somewhat original choices: | |
| 33 | |
| 34 * Separation of core and I/O: the stateful encoder and decoder engines in | |
| 35 libtwamr operate on a custom frame structure that includes the array of codec | |
| 36 parameters in their broken-down form (e.g., 57 parameters for MR122), the | |
| 37 frame type as in original RXFrameType and TXFrameType, and the codec mode. | |
| 38 Conversion between this internal canonical form (which is most native to the | |
| 39 guts of the encoder and decoder engines) and external I/O formats (the 3GPP | |
| 40 test sequence format and the more practical RFC 4867 format used in RTP and | |
| 41 in .amr recording files) is relegated to stateless utility functions. | |
| 42 | |
| 43 * Both VAD1 and VAD2 included: the reference code from 3GPP includes two | |
| 44 alternative versions of Voice Activity Detection algorithm, VAD1 and VAD2. | |
| 45 Implementors are allowed to use either version and be compliant; 3GPP code | |
| 46 uses conditional compilation to select between the two, and it appears that | |
| 47 no thought was given to the possibility that a real implementation would | |
| 48 incorporate both VAD versions, to be selected at run time. However, given our | |
| 49 (ThemWi) desire for bit-exact testing against other people's implementations, | |
| 50 it made no sense for us to arbitrarily select one VAD version and drop the | |
| 51 other - hence we took the unconventional route of incorporating both VAD1 and | |
| 52 VAD2 into libtwamr, and designing our encoder API so that library users get | |
| 53 to select which VAD they wish to apply. | |
| 54 | |
| 55 Like all other Themyscira GSM codec libraries, libtwamr includes the codec | |
| 56 homing feature in both encoder and decoder directions, as required by 3GPP | |
| 57 specs. Furthermore, libtwamr implementation of this codec homing feature | |
| 58 includes the following simple extensions (simple in terms of low implementation | |
| 59 cost) to facilitate construction of an AMR-EFR hybrid encoder and decoder: | |
| 60 | |
| 61 * In the decoder direction, the main AMR frame decoder function includes a DHF | |
| 62 detector as required by 3GPP architecture. In libtwamr this function can be | |
| 63 told to trigger on EFR DHF instead of MR122 version, by way of a flag set in | |
| 64 the mode field of the frame structure passed to amr_decode_frame(). | |
| 65 | |
| 66 * In the encoder direction, the regular call to amr_encode_frame() - standard | |
| 67 for AMR - can be followed with a call to amr_dhf_subst_efr() or | |
| 68 amr_dhf_subst_efr2() before passing the array of encoded parameters to | |
| 69 EFR_params2frame() from libgsmefr. See AMR-EFR-hybrid-emu article for more | |
| 70 information. The AMR-EFR hybrid test sequences in amr122_efr.zip pass on | |
| 71 both amr_dhf_subst_efr() and amr_dhf_subst_efr2() versions, but the latter | |
| 72 additionally matches the observable behavior of T-Mobile USA. | |
| 73 | |
| 74 The mechanism that allows libtwamr to be used for AMR-EFR hybrid implementation | |
| 75 (as opposed to the more conventional use case of implementing standard AMR-NB) | |
| 76 is kept out of the main stateful paths: there are no separate AMR-EFR hybrid | |
| 77 encoder or decoder sessions that are distinguishable from regular AMR encoding | |
| 78 and decoding in terms of state. In the decoder direction, the main AMR frame | |
| 79 decoder function needs to know which DHF it should check for, but this | |
| 80 indication is embedded in the mode field in struct amr_param_frame and not in | |
| 81 the state. In the encoder direction, the mechanism is a separate function | |
| 82 (stateless) that needs to be called between amr_encode_frame() and | |
| 83 EFR_params2frame(). This approach dovetails nicely with the core vs I/O | |
| 84 separation: the option of AMR-EFR hybrid can be viewed as a different I/O front | |
| 85 end to the same AMR engine, alongside with 3GPP AMR test sequence and RFC 4867 | |
| 86 I/O options. | |
| 87 | |
| 88 Please refer to AMR-library-API article for further details. |
