# g711a1_plc.h

Go to the documentation of this file.

    00001 /*
    00002  * g711a1_plc.h
    00003  *
    00004  * packet loss concealment algorithm is based on the ITU recommendation
    00005  * G.711 Appendix I.
    00006  *
    00007  * Copyright (c) 2008 Christian Hoene, University of Tuebingen, Germany
    00008  *
    00009  * The contents of this file are subject to the Mozilla Public License
    00010  * Version 1.0 (the "License"); you may not use this file except in
    00011  * compliance with the License. You may obtain a copy of the License at
    00012  * http://www.mozilla.org/MPL/
    00013  *
    00014  * Software distributed under the License is distributed on an "AS IS"
    00015  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
    00016  * the License for the specific language governing rights and limitations
    00017  * under the License.
    00018  *
    00019  * The Initial Developer of the Original Code is Christian Hoene
    00020  * based on the code given in ITU-T Recommendation G.711 Appendix I (09/99)
    00021  * "A high quality low-complexity algorithm for packet loss concealment with G.711"
    00022  * Approved in 1999-09, www.itu.int.
    00023  *
    00024  * Contributor(s): ______________________________________.
    00025  *
    00026  * $Revision: 20373 $
    00027  * $Author: rjongbloed $
    00028  * $Date: 2008-06-03 13:15:06 +0000 (Tue, 03 Jun 2008) $
    00029  */
    00030
    00031 #ifndef __CODEC_G711A1_PLC_H__
    00032 #define __CODEC_G711A1_PLC_H__
    00033
    00034 #include <opal/buildopts.h>
    00035
    00036 #if OPAL_G711PLC
    00037
    00038
    00043 class OpalG711_PLC
    00044 {
    00045   private:
    00046     enum {
    00047       LOSS_PERIOD1=10,
    00048       LOSS_PERIOD2start=20,
    00049       LOSS_PERIOD2overlap=21,
    00050       LOSS_PERIOD2=22,
    00051       LOSS_PERIOD3=30,
    00052       TRANSITION=40,
    00053       NOLOSS=0
    00054     } mode;
    00056     int      conceal_count;
    00058     short  * transition_buf;
    00059     int      transition_len;
    00060     int      transition_count;
    00062     int      hist_len;
    00063     short  * hist_buf;
    00064     short  * tmp_buf;
    00066     short *  conceal_overlapbuf;
    00068     double * pitch_buf;
    00069     double * pitch_lastq;
    00071     int      pitch_min;
    00072     int      pitch_max;
    00073     int      pitch_overlap;
    00074     int      pitch_offset;
    00075     int      pitch;
    00076     int      pitch_blen;
    00077     int      pitch_overlapmax;
    00079     int      rate;
    00081     int ms2samples(int ms) const
    00082     {
    00083       return ms*rate/1000;
    00084     }
    00085
    00086
    00087    public:
    00088     OpalG711_PLC(int rate=8000, double pitch_low=66.6, double pitch_high=200);
    00089     ~OpalG711_PLC();
    00090
    00091     void dofe(short *s, int size);
    00092     void addtohistory(short *s, int size);
    00093     int getAlgDelay() const { return pitch_overlapmax; };
    00094     void drop(short *s, int size);
    00096    private:
    00097     void scalespeech(short *inout, int sz, bool decay=true) const;
    00098     void getfespeech(short *out, int sz);
    00099     void hist_savespeech(short *s, int size);
    00100     int findpitch();
    00101     void overlapadd(double *l, double *r, double *o, int cnt) const;
    00102     void overlapadds(short *l, short *r, short *o, int cnt) const;
    00103     void overlapaddatend(short *s, short *f, int start, int end, int count) const;
    00104     void convertsf(short *f, double *t, int cnt) const;
    00105     void convertfs(double *f, short *t, int cnt) const;
    00106
    00107     inline void copy(double *f, double *t, int cnt) const { memmove(t,f,cnt*sizeof(double)); };
    00108     inline void copy(short *f, short *t, int cnt) const { memmove(t,f,cnt*sizeof(short)); };
    00109     inline void zero(short *s, int cnt) const { memset(s, 0, cnt*sizeof(short)); };
    00110
    00111     int dofe_partly(short *out, int size);
    00112 };
    00113
    00114
    00115 #endif // OPAL_G711PLC
    00116 #endif // __CODEC_G711A1_PLC_H__