FreeCalypso > hg > gsm-codec-lib
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/AMR-library-desc Sat May 18 21:22:07 2024 +0000 @@ -0,0 +1,88 @@ +Themyscira libtwamr general description +======================================= + +Libtwamr is a librification of the official AMR reference C code from 3GPP, +produced by Themyscira Wireless and styled to match our libraries for more +classic GSM codecs. This library has been created with the following two goals +in mind: + +1) At the present time we (ThemWi) operate our GSM network with only GSM-FR and + GSM-EFR codecs, with the latter being preferred. We do not currently operate + with AMR because the conditions under which AMR becomes advantageous do not + currently exist in our network operation. However, we need to be prepared + for the possibility that the conditions which make AMR desirable may arise + some day, and we may need to start deploying AMR. In order to make AMR + deployment a possibility, many parts will need to be implemented, one of + which is a speech transcoding library that implements the AMR codec in the + same way how libgsmfr2 and libgsmefr implement the more classic codecs which + we use currently. + +2) Many other commercial GSM networks have implemented EFR speech service using + a type of AMR-EFR hybrid described in AMR-EFR-philosophy and + AMR-EFR-hybrid-emu articles. As part of certain behavioral reverse + engineering experiments, we sometimes need to model the bit-exact operation + of those other-people-controlled commercial implementations of AMR-EFR, and + our current libtwamr provides one way to do so. Knowing that a proper + implementation of an AMR codec library is likely to be needed some day for + reason 1 above, justification was obtained for expending the effort to + produce the present libtwamr. + +Compared to other plausible ways in which someone could reasonably approach the +task of librifying the AMR reference code from 3GPP, the design of libtwamr +includes two somewhat original choices: + +* Separation of core and I/O: the stateful encoder and decoder engines in + libtwamr operate on a custom frame structure that includes the array of codec + parameters in their broken-down form (e.g., 57 parameters for MR122), the + frame type as in original RXFrameType and TXFrameType, and the codec mode. + Conversion between this internal canonical form (which is most native to the + guts of the encoder and decoder engines) and external I/O formats (the 3GPP + test sequence format and the more practical RFC 4867 format used in RTP and + in .amr recording files) is relegated to stateless utility functions. + +* Both VAD1 and VAD2 included: the reference code from 3GPP includes two + alternative versions of Voice Activity Detection algorithm, VAD1 and VAD2. + Implementors are allowed to use either version and be compliant; 3GPP code + uses conditional compilation to select between the two, and it appears that + no thought was given to the possibility that a real implementation would + incorporate both VAD versions, to be selected at run time. However, given our + (ThemWi) desire for bit-exact testing against other people's implementations, + it made no sense for us to arbitrarily select one VAD version and drop the + other - hence we took the unconventional route of incorporating both VAD1 and + VAD2 into libtwamr, and designing our encoder API so that library users get + to select which VAD they wish to apply. + +Like all other Themyscira GSM codec libraries, libtwamr includes the codec +homing feature in both encoder and decoder directions, as required by 3GPP +specs. Furthermore, libtwamr implementation of this codec homing feature +includes the following simple extensions (simple in terms of low implementation +cost) to facilitate construction of an AMR-EFR hybrid encoder and decoder: + +* In the decoder direction, the main AMR frame decoder function includes a DHF + detector as required by 3GPP architecture. In libtwamr this function can be + told to trigger on EFR DHF instead of MR122 version, by way of a flag set in + the mode field of the frame structure passed to amr_decode_frame(). + +* In the encoder direction, the regular call to amr_encode_frame() - standard + for AMR - can be followed with a call to amr_dhf_subst_efr() or + amr_dhf_subst_efr2() before passing the array of encoded parameters to + EFR_params2frame() from libgsmefr. See AMR-EFR-hybrid-emu article for more + information. The AMR-EFR hybrid test sequences in amr122_efr.zip pass on + both amr_dhf_subst_efr() and amr_dhf_subst_efr2() versions, but the latter + additionally matches the observable behavior of T-Mobile USA. + +The mechanism that allows libtwamr to be used for AMR-EFR hybrid implementation +(as opposed to the more conventional use case of implementing standard AMR-NB) +is kept out of the main stateful paths: there are no separate AMR-EFR hybrid +encoder or decoder sessions that are distinguishable from regular AMR encoding +and decoding in terms of state. In the decoder direction, the main AMR frame +decoder function needs to know which DHF it should check for, but this +indication is embedded in the mode field in struct amr_param_frame and not in +the state. In the encoder direction, the mechanism is a separate function +(stateless) that needs to be called between amr_encode_frame() and +EFR_params2frame(). This approach dovetails nicely with the core vs I/O +separation: the option of AMR-EFR hybrid can be viewed as a different I/O front +end to the same AMR engine, alongside with 3GPP AMR test sequence and RFC 4867 +I/O options. + +Please refer to AMR-library-API article for further details.