Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mumble-voip/mumble.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThorvald Natvig <slicer@users.sourceforge.net>2008-02-26 03:04:00 +0300
committerThorvald Natvig <slicer@users.sourceforge.net>2008-02-26 03:04:00 +0300
commit4c5f56d4c491480dfa3d49abb696ffaad86a3077 (patch)
tree6942869d425f9c2d921296c27cfb2a45262e3506 /speexbuild
parenta9adffb2369b4263b3669f6c882e8696207c9675 (diff)
Support profile-optimized libspeex. Slim gain so far, waiting to test on Core2
git-svn-id: https://mumble.svn.sourceforge.net/svnroot/mumble/trunk@955 05730e5d-ab1b-0410-a4ac-84af385074fa
Diffstat (limited to 'speexbuild')
-rw-r--r--speexbuild/SpeexMark.cpp97
-rw-r--r--speexbuild/speexbuild.pro11
2 files changed, 108 insertions, 0 deletions
diff --git a/speexbuild/SpeexMark.cpp b/speexbuild/SpeexMark.cpp
new file mode 100644
index 000000000..c913487ec
--- /dev/null
+++ b/speexbuild/SpeexMark.cpp
@@ -0,0 +1,97 @@
+#include <QtCore>
+#include <math.h>
+#include <speex/speex.h>
+#include <speex/speex_jitter.h>
+#include <speex/speex_preprocess.h>
+#include <speex/speex_echo.h>
+#include <speex/speex_callbacks.h>
+#include <valgrind/callgrind.h>
+
+#include "Timer.h"
+
+int main(int argc, char **argv) {
+
+ CALLGRIND_STOP_INSTRUMENTATION;
+ CALLGRIND_ZERO_STATS;
+
+ QCoreApplication a(argc, argv);
+
+ QFile f((argc >= 2) ? argv[1] : "wb_male.wav");
+ if (! f.open(QIODevice::ReadOnly)) {
+ qFatal("Failed to open file!");
+ }
+ f.seek(36 + 8);
+
+ void *enc = speex_encoder_init(&speex_wb_mode);
+
+ int iarg = 1;
+ speex_encoder_ctl(enc, SPEEX_SET_VBR, &iarg);
+ iarg = 0;
+ speex_encoder_ctl(enc, SPEEX_SET_VAD, &iarg);
+ speex_encoder_ctl(enc, SPEEX_SET_DTX, &iarg);
+
+ float farg = 6.0;
+ speex_encoder_ctl(enc, SPEEX_SET_VBR_QUALITY, &farg);
+ speex_encoder_ctl(enc, SPEEX_GET_BITRATE, &iarg);
+ speex_encoder_ctl(enc, SPEEX_SET_VBR_MAX_BITRATE, &iarg);
+
+ iarg = 4;
+ speex_encoder_ctl(enc, SPEEX_SET_COMPLEXITY, &iarg);
+
+ int iFrameSize;
+ speex_encoder_ctl(enc, SPEEX_GET_FRAME_SIZE, &iFrameSize);
+
+ SpeexPreprocessState *spp = speex_preprocess_state_init(iFrameSize, 16000);
+ iarg = 1;
+ speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_VAD, &iarg);
+ speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_DENOISE, &iarg);
+ speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_AGC, &iarg);
+ speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_DEREVERB, &iarg);
+
+ SpeexEchoState *ses = speex_echo_state_init(iFrameSize, iFrameSize * 10);
+ iarg = 16000;
+ speex_echo_ctl(ses, SPEEX_SET_SAMPLING_RATE, &iarg);
+ speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_ECHO_STATE, ses);
+
+ QVector<QByteArray> v;
+ while(1) {
+ QByteArray qba = f.read(iFrameSize * 2);
+ if (qba.size() != iFrameSize * 2)
+ break;
+ v.append(qba);
+ }
+
+ int nframes = v.size();
+
+ qWarning("Ready to process %d frames of %d samples", nframes, iFrameSize);
+
+ QVector<short *> sv;
+
+ short tframe[iFrameSize];
+ for(int i=0;i<iFrameSize;i++)
+ tframe[i] = 0;
+
+ for(int i=0;i<nframes;i++) {
+ sv.append(reinterpret_cast<short *>(v[i].data()));
+ }
+
+ SpeexBits sb;
+ speex_bits_init(&sb);
+
+ Timer t;
+ t.restart();
+
+ CALLGRIND_START_INSTRUMENTATION;
+ for(int i=0;i<nframes-2;i++) {
+ speex_bits_reset(&sb);
+ speex_echo_cancellation(ses, sv[i], sv[i+2], tframe);
+ speex_preprocess_run(spp, tframe);
+ speex_encode_int(enc, tframe, &sb);
+ }
+ CALLGRIND_STOP_INSTRUMENTATION;
+
+ quint64 e = t.elapsed();
+
+ qWarning("Used %llu usec", e);
+ qWarning("%.2f times realtime", (20000ULL * nframes) / (e * 1.0));
+}
diff --git a/speexbuild/speexbuild.pro b/speexbuild/speexbuild.pro
index 5d814e0b0..374a38177 100644
--- a/speexbuild/speexbuild.pro
+++ b/speexbuild/speexbuild.pro
@@ -43,3 +43,14 @@ CONFIG(symbols) {
QMAKE_LFLAGS -= -Wl,-s
QMAKE_LFLAGS_RELEASE -= -Wl,-s
}
+
+CONFIG(optgen) {
+ QMAKE_CFLAGS += -O3 -ffast-math -ftree-vectorize -fprofile-generate
+}
+
+CONFIG(optimize) {
+ !exists(release/speex.gcda) {
+ error(You need to run SpeexMark first)
+ }
+ QMAKE_CFLAGS += -O3 -ffast-math -ftree-vectorize -fprofile-use
+}