00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef OPAL_CODEC_SILENCEDETECT_H
00031 #define OPAL_CODEC_SILENCEDETECT_H
00032
00033 #ifdef P_USE_PRAGMA
00034 #pragma interface
00035 #endif
00036
00037 #include <opal/buildopts.h>
00038 #include <rtp/rtp.h>
00039
00040
00042
00043 class OpalSilenceDetector : public PObject
00044 {
00045 PCLASSINFO(OpalSilenceDetector, PObject);
00046 public:
00047 enum Mode {
00048 NoSilenceDetection,
00049 FixedSilenceDetection,
00050 AdaptiveSilenceDetection,
00051 NumModes
00052 };
00053
00054 struct Params {
00055 Params(
00056 Mode mode = AdaptiveSilenceDetection,
00057 unsigned threshold = 0,
00058 unsigned signalDeadband = 80,
00059 unsigned silenceDeadband = 3200,
00060 unsigned adaptivePeriod = 4800
00061 )
00062 : m_mode(mode),
00063 m_threshold(threshold),
00064 m_signalDeadband(signalDeadband),
00065 m_silenceDeadband(silenceDeadband),
00066 m_adaptivePeriod(adaptivePeriod)
00067 { }
00068
00069 Mode m_mode;
00070 unsigned m_threshold;
00071 unsigned m_signalDeadband;
00072 unsigned m_silenceDeadband;
00073 unsigned m_adaptivePeriod;
00074 };
00075
00080 OpalSilenceDetector(
00081 const Params & newParam
00082 );
00084
00087 const PNotifier & GetReceiveHandler() const { return receiveHandler; }
00088
00093 void SetParameters(
00094 const Params & newParam
00095 );
00096
00105 Mode GetStatus(
00106 PBoolean * isInTalkBurst,
00107 unsigned * currentThreshold
00108 ) const;
00109
00118 virtual unsigned GetAverageSignalLevel(
00119 const BYTE * buffer,
00120 PINDEX size
00121 ) = 0;
00122
00123 protected:
00124 PDECLARE_NOTIFIER(RTP_DataFrame, OpalSilenceDetector, ReceivedPacket);
00125
00126 PNotifier receiveHandler;
00127
00128 Params param;
00129
00130 unsigned lastTimestamp;
00131 unsigned receivedTime;
00132 unsigned levelThreshold;
00133 unsigned signalMinimum;
00134 unsigned silenceMaximum;
00135 unsigned signalReceivedTime;
00136 unsigned silenceReceivedTime;
00137 bool inTalkBurst;
00138 };
00139
00140
00141 class OpalPCM16SilenceDetector : public OpalSilenceDetector
00142 {
00143 PCLASSINFO(OpalPCM16SilenceDetector, OpalSilenceDetector);
00144 public:
00147 OpalPCM16SilenceDetector(
00148 const Params & newParam
00149 ) : OpalSilenceDetector(newParam) { }
00150
00161 virtual unsigned GetAverageSignalLevel(
00162 const BYTE * buffer,
00163 PINDEX size
00164 );
00166 };
00167
00168
00169 extern ostream & operator<<(ostream & strm, OpalSilenceDetector::Mode mode);
00170
00171
00172 #endif // OPAL_CODEC_SILENCEDETECT_H
00173
00174