view doc/FR1-library-desc @ 533:3a617e4e9b27

libgsmfr2: add const words with struct sizes
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 19 Sep 2024 21:58:10 +0000
parents 6b479cfb06a4
children
line wrap: on
line source

Themyscira libgsmfr2 is our new (2024) library offering for GSM FRv1 codec,
replacing the previous combination of libgsm (classic 1990s free sw offering)
and libgsmfrp (our add-on).  That combination appeared satisfactory at first
because of how the decoder processing chain is defined for FRv1 (the Rx DTX
handler forms a modular piece, passing a frame of 260 bits to unmodified "pure"
GSM 06.10 decoder), but use of legacy libgsm presents some difficulties:

* Inconvenience and inconsistency: for all other supported GSM speech codecs,
  Themyscira libraries provide the complete solution, not depending on anyone
  else's software, but for FRv1 we depended on a library that was created in a
  different era for non-GSM applications but just happens, almost by accident,
  to be a bit-exact implementation of GSM 06.10 spec.

* Poor design in frame packing and unpacking functions: the operations of
  bit-shuffling a GSM-FR codec frame between the array of parameters form
  (76 words) and the packed RTP format used in IP-based GSM RAN (33 bytes) are
  stateless pure functions, but their implementations in libgsm (gsm_explode()
  and gsm_implode()) require a state structure.  (Libgsm supports WAV49 format
  in addition to the RTP-adopted one, and WAV49 packing is stateful - but this
  WAV49 feature is of no use and no relevance in real GSM applications.)

* No ability to implement homing: the internal state structure used by libgsm
  is set to the home state when it is allocated with gsm_create(), but there is
  no reset function, and such function cannot be implemented externally when
  the state structure is private to the library and not exposed.  Therefore,
  the optional codec homing feature defined in later versions of GSM 06.10 spec
  cannot be implemented in a wrapper around legacy libgsm, causing the resulting
  FOSS implementation to be inferior to existing commercial implementations
  (deployed in practice by incumbent nation-scale networks) which do implement
  this feature.

In response to the above issues, we now have a new library named libgsmfr2 that
provides all needed functions for GSM-FR codec "under one roof", harmonized
with our support for other GSM speech codecs.  However, the modularity that is
inherent in the way this codec is defined in the specs (contrast with EFR) is
still retained in the design of our library, which exhibits the following 4
functional divisions:

1) Libgsmfr2 includes a "pure" GSM 06.10 encoder and decoder, directly
   corresponding to old libgsm.  This code is in fact lifted from libgsm,
   ported into Themyscira gsm-codec-lib style in terms of C dialect, defined
   types and naming conventions.  The reset function that is missing in libgsm
   is now provided, however, fixing that defect.

2) The Rx DTX handler component is unchanged from our previous libgsmfrp.  Per
   the relevant specs (GSM 06.11, 06.12 and 06.31) this component is a modular
   piece: it emits a standard 260-bit frame of GSM 06.10 parameters that can be
   fed to anyone else's implementation of the latter standard.

3) Full decoder: this component is a wrapper around an 06.10 decoder instance
   and an Rx DTX instance, providing functionality equivalent to the standard
   decoder function in other GSM speech codecs.

4) Stateless utility functions for frame format conversions (packing and
   unpacking) and for incoming SID classification.  An application can freely
   use just these functions, without pulling in any encoder or decoder or
   stateful preprocessor functionality, making the present library very
   convenient for debug utilities.

The homing feature is available in both encoder and decoder directions, but it
is implemented differently between the two:

* In the encoder direction, if the application wishes to enable the possibility
  of in-band homing, it needs to call gsmfr_0610_encoder_homing() after the
  regular call to gsmfr_0610_encode_frame() or gsmfr_0610_encode_params().

* In the decoder direction, the homing feature is always included if one uses
  the "fulldec" (full decoder) wrapper (it is implemented in that layer), and
  never included if one uses the "basic" GSM 06.10 decoder by itself, or the
  Rx DTX handler block by itself.

The only major feature of GSM-FR codec that is currently absent in libgsmfr2 is
application of DTX in the encoder direction: GSM 06.32 VAD followed by DTX
hangover logic and SID output.  This omission is currently acceptable for
Themyscira Wireless: DTXd (DTX in the radio downlink direction) is not allowed
when each BTS operates at only one carrier frequency, which makes it pointless
to enable DTX for speech encoding at the network edge transcoder, and we are not
trying to replace TI Calypso DSP on the MS side of GSM.  However, if this
situation changes and some need arises for a FOSS implementation of DTX-enabled
GSM-FR encoder, the architecture of Themyscira libgsmfr2 should make it possible
to integrate such addition.