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: 21408 $
00027  * $Author: csoutheren $
00028  * $Date: 2008-10-23 07:08:46 +0000 (Thu, 23 Oct 2008) $
00029  */
00030 
00031 #ifndef OPAL_CODEC_G711A1_PLC_H
00032 #define OPAL_CODEC_G711A1_PLC_H
00033 
00034 #ifndef SBC_DISABLE_PTLIB
00035 #include <opal/buildopts.h>
00036 #endif
00037 
00038 #if OPAL_G711PLC
00039 
00040 #include <string.h>
00041 
00046 class OpalG711_PLC
00047 {
00048   private:
00049     enum {
00050       LOSS_PERIOD1=10,            
00051       LOSS_PERIOD2start=20,       
00052       LOSS_PERIOD2overlap=21,     
00053       LOSS_PERIOD2=22,            
00054       LOSS_PERIOD3=30,            
00055       TRANSITION=40,              
00056       NOLOSS=0                    
00057     } mode;                       
00059     int      conceal_count;       
00061     short  * transition_buf;      
00062     int      transition_len;      
00063     int      transition_count;    
00065     int      hist_len;            
00066     short  * hist_buf;            
00067     short  * tmp_buf;             
00069     short *  conceal_overlapbuf;  
00071     double * pitch_buf;           
00072     double * pitch_lastq;         
00074     int      pitch_min;           
00075     int      pitch_max;           
00076     int      pitch_overlap;       
00077     int      pitch_offset;        
00078     int      pitch;               
00079     int      pitch_blen;          
00080     int      pitch_overlapmax;    
00082     int      rate;                
00084     int ms2samples(int ms) const  
00085     {
00086       return ms*rate/1000;
00087     }
00088 
00089 
00090    public:
00091     OpalG711_PLC(int rate=8000, double pitch_low=66.6, double pitch_high=200);    
00092     ~OpalG711_PLC();
00093 
00094     void dofe(short *s, int size);         
00095     void addtohistory(short *s, int size);       
00096     int getAlgDelay() const { return pitch_overlapmax; };  
00097     void drop(short *s, int size);               
00099    private:
00100     void scalespeech(short *inout, int sz, bool decay=true) const;
00101     void getfespeech(short *out, int sz);
00102     void hist_savespeech(short *s, int size);
00103     int findpitch();
00104     void overlapadd(double *l, double *r, double *o, int cnt) const;
00105     void overlapadds(short *l, short *r, short *o, int cnt) const;
00106     void overlapaddatend(short *s, short *f, int start, int end, int count) const;
00107     void convertsf(short *f, double *t, int cnt) const;
00108     void convertfs(double *f, short *t, int cnt) const;
00109 
00110     inline void copy(double *f, double *t, int cnt) const { memmove(t,f,cnt*sizeof(double)); };
00111     inline void copy(short *f, short *t, int cnt) const { memmove(t,f,cnt*sizeof(short)); };
00112     inline void zero(short *s, int cnt) const { memset(s, 0, cnt*sizeof(short)); };
00113 
00114     int dofe_partly(short *out, int size);
00115 };
00116 
00117 
00118 #endif // OPAL_G711PLC
00119 
00120 #endif // OPAL_CODEC_G711A1_PLC_H

Generated on Mon Feb 1 00:25:19 2010 for OPAL by  doxygen 1.5.1