aboutsummaryrefslogtreecommitdiffstats
path: root/doc/tex/plc.tex
diff options
context:
space:
mode:
Diffstat (limited to 'doc/tex/plc.tex')
-rw-r--r--doc/tex/plc.tex139
1 files changed, 0 insertions, 139 deletions
diff --git a/doc/tex/plc.tex b/doc/tex/plc.tex
deleted file mode 100644
index 40dfd532f..000000000
--- a/doc/tex/plc.tex
+++ /dev/null
@@ -1,139 +0,0 @@
-\section{What is PLC?}
-
- PLC stands for Packet Loss Concealment. PLC describes any method of generating
-new audio data when packet loss is detected. In Asterisk, there are two main flavors
-of PLC, generic and native. Generic PLC is a method of generating audio data on
-signed linear audio streams. Signed linear audio, often abbreviated "slin," is required
-since it is a raw format that has no companding, compression, or other transformations
-applied. Native PLC is used by specific codec implementations, such as
-iLBC and Speex, which generates the new audio in the codec's native format. Native
-PLC happens automatically when using a codec that supports native PLC. Generic PLC
-requires specific configuration options to be used and will be the focus of this
-document.
-
-\section{How does Asterisk detect packet loss?}
-
- Oddly, Asterisk does not detect packet loss when reading audio in. In order to
-detect packet loss, one must have a jitter buffer in use on the channel on which
-Asterisk is going to write missing audio using PLC. When a jitter buffer is in use,
-audio that is to be written to the channel is fed into the jitterbuffer. When the
-time comes to write audio to the channel, a bridge will request that the jitter
-buffer gives a frame of audio to the bridge so that the audio may be written. If
-audio is requested from the jitter buffer but the jitter buffer is unable to give
-enough audio to the bridge, then the jitter buffer will return an interpolation
-frame. This frame contains no actual audio data and indicates the number of samples
-of audio that should be inserted into the frame.
-
-\section{A bit of background on translation}
-
- As stated in the introduction, generic PLC can only be used on slin audio.
-The majority of audio communication is not done in slin, but rather using lower
-bandwidth codecs. This means that for PLC to be used, there must be a translation
-step involving slin on the write path of a channel. This means that PLC cannot
-be used if the codecs on either side of the bridge are the same or do not require
-a translation to slin in order to translate between them. For instance, a
-ulaw $<$-$>$ ulaw call will not use PLC since no translation is required. In addition,
-a ulaw $<$-$>$ alaw call will also not use PLC since the translation path does not
-include any step involving slin.
- One item of note is that slin must be present on the write path of a channel
-since that is the path where PLC is applied. Consider that Asterisk is bridging
-channels A and B. A uses ulaw for audio and B uses GSM. This translation involves
-slin, so things are shaping up well for PLC. Consider, however if Asterisk sets
-up the translation paths like so:
-\begin{verbatim}
-
- Fig. 1
-
-A +------------+ B
-<---ulaw<---slin<---GSM| |GSM--->
- | Asterisk |
-ulaw--->slin--->GSM--->| |<---GSM
- +------------+
-
-\end{verbatim}
- The arrows indicate the direction of audio flow. Each channel has a write
-path (the top arrow) and a read path (the bottom arrow). In this setup, PLC
-can be used when sending audio to A, but it cannot be used when sending audio
-to B. The reason is simple, the write path to A's channel contains a slin
-step, but the write path to B contains no slin step. Such a translation setup
-is perfectly valid, and Asterisk can potentially set up such a path depending
-on circumstances. When we use PLC, however, we want slin audio to be present
-on the write paths of both A and B. A visual representation of what we want
-is the following:
-\begin{verbatim}
-
- Fig. 2
-
-A +------------+ B
-<---ulaw<---slin| |slin--->GSM--->
- | Asterisk |
-ulaw--->slin--->| |<---slin<---GSM
- +------------+
-
-\end{verbatim}
- In this scenario, the write paths for both A and B begin with slin,
-and so PLC may be applied to either channel. This translation behavior has,
-in the past been doable with the \texttt{transcode\_via\_sln} option in \path{asterisk.conf}.
-Recent changes to the PLC code have also made the \texttt{genericplc} option in
-\path{codecs.conf} imply the \texttt{transcode\_via\_sln} option. The result is that by
-enabling \texttt{genericplc} in \path{codecs.conf}, the translation path set up in
-Fig. 2 should automatically be used.
-
-\section{Additional restrictions and caveats}
-
- One restriction that has not been spelled out so far but that has been
-hinted at is the presence of a bridge. The term bridge in this sense means
-two channels exchanging audio with one another. A bridge is required because
-use of a jitter buffer is a prerequisite for using PLC, and a jitter buffer
-is only used when bridging two channels. This means that one-legged calls,
-(e.g. calls to voicemail, to an IVR, to an extension that just plays back
-audio) will not use PLC. In addition, MeetMe and ConfBridge calls will not
-use PLC.
- It should be obvious, but it bears mentioning, that PLC cannot be used
-when using a technology's native bridging functionality. For instance, if
-two SIP channels can exchange RTP directly, then Asterisk will never be
-able to process the audio in the first place. Since translation of audio
-is a requirement for using PLC, and translation will not allow for a
-native bridge to be created, this is something that is not likely to be
-an issue, though.
- Since a jitter buffer is a requirement in order to use PLC, it should
-be noted that simply enabling the jitter buffer via the \texttt{jbenable} option
-may not be enough. For instance, if bridging two SIP channels together,
-the default behavior will not be to enable jitter buffers on either channel.
-The rationale is that the jitter will be handled at the endpoints to which
-Asterisk is sending the audio. In order to ensure that a jitter buffer is
-used in all cases, one must enable the \texttt{jbforce} option for channel types
-on which PLC is desired.
-
-\section{Summary}
- The following are all required for PLC to be used:
-\begin{itemize}
-\item Enable \texttt{genericplc} in the \texttt{plc} section of \path{codecs.conf}
-\item Enable (and potentially force) jitter buffers on channels
-\item Two channels must be bridged together for PLC to be used
-(no Meetme or one-legged calls)
-\item The audio must be translated between the two channels
-and must have slin as a step in the translation process.
-\end{itemize}
-
-\section{Protip}
-
- One of the restrictions mentioned is that PLC will only
-be used when two audio channels are bridged together. Through the
-use of Local channels, you can create a bridge even if the call
-is, for all intents and purposes, one-legged. By using a combination
-of the /n and /j suffixes for a Local channel, one can ensure
-that the Local channel is not optimized out of the talk path
-and that a jitter buffer is applied to the Local channel as well.
-Consider the following simple dialplan:
-\begin{verbatim}
-
-[example]
-exten => 1,1,Playback(tt-weasels)
-exten => 2,1,Dial(Local/1@example/nj)
-
-\end{verbatim}
-When dialing extension 1, PLC cannot be used because there
-will be only a single channel involved. When dialing extension
-2, however, Asterisk will create a bridge between the incoming
-channel and the Local channel, thus allowing PLC to be used.