OPAL Version 3.10.2
|
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: 24499 $ 00027 * $Author: rjongbloed $ 00028 * $Date: 2010-06-15 04:29:05 -0500 (Tue, 15 Jun 2010) $ 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 modes { 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 }; 00058 00059 int conceal_count; 00061 short * transition_buf; 00063 int hist_len; 00064 int pitch_overlapmax; 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; 00077 struct channel_counters { 00078 enum modes mode; 00079 int conceal_count; 00080 int transition_len; 00081 int transition_count; 00083 int pitch_overlap; 00084 int pitch_offset; 00085 int pitch; 00086 int pitch_blen; 00087 } *channel; 00088 00089 int rate; 00090 int channels; 00092 int ms2samples(int ms) const 00093 { 00094 return ms*rate/1000; 00095 } 00096 00097 00098 public: 00099 OpalG711_PLC(int rate=8000, int channels=1, double pitch_low=66.6, double pitch_high=200); 00100 ~OpalG711_PLC(); 00101 00102 void dofe(short *s, int size); 00103 void addtohistory(short *s, int size); 00104 int getAlgDelay() const { return pitch_overlapmax; }; 00105 void drop(short *s, int size); 00107 private: 00108 void scalespeech(short *inout, int c, int sz, bool decay=true) const; 00109 void getfespeech(short *out, int c, int sz); 00110 void hist_savespeech(short *s, int size); 00111 int findpitch(int c); 00112 void overlapadd(double *l, double *r, double *o, int c, int cnt) const; 00113 void overlapadds(short *l, short *r, short *o, int c, int cnt) const; 00114 void overlapaddatend(short *s, short *f, int c, int start, int end, int count) const; 00115 void convertsf(short *f, double *t, int c, int cnt) const; 00116 void convertfs(double *f, short *t, int c, int cnt) const; 00117 00118 inline void copy(double *f, double *t, int cnt) const { memmove(t,f,cnt*channels*sizeof(double)); }; 00119 inline void copy(short *f, short *t, int cnt) const { memmove(t,f,cnt*channels*sizeof(short)); }; 00120 00121 int dofe_partly(short *out, int c, int size); 00122 }; 00123 00124 00125 #endif // OPAL_G711PLC 00126 00127 #endif // OPAL_CODEC_G711A1_PLC_H