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__

Generated on Mon Sep 15 11:48:42 2008 for OPAL by  doxygen 1.5.1