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

github.com/xiph/speex.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>2008-04-11 07:48:31 +0400
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>2008-04-11 07:48:31 +0400
commiteb717d6a309c475aadf66d8bbb44e31f0997fbef (patch)
tree5fa271c92dbc1260dfe72dd282d0baeb43171215
parentd9ca7526e187474bce53b94ca0220f4a39f18baa (diff)
Thorvald Natvig contributed a fix the the jitter buffer resync and a testcase
for the jitter buffer. git-svn-id: http://svn.xiph.org/trunk/speex@14700 0101bb08-14d6-0310-b084-bc0e0c8e3800
-rw-r--r--libspeex/Makefile.am4
-rw-r--r--libspeex/jitter.c11
-rw-r--r--libspeex/testjitter.c75
3 files changed, 85 insertions, 5 deletions
diff --git a/libspeex/Makefile.am b/libspeex/Makefile.am
index 8dec1b5..b0c5bef 100644
--- a/libspeex/Makefile.am
+++ b/libspeex/Makefile.am
@@ -32,7 +32,7 @@ noinst_HEADERS = arch.h cb_search_arm4.h cb_search_bfin.h cb_search_sse.h \
libspeex_la_LDFLAGS = -no-undefined -version-info @SPEEX_LT_CURRENT@:@SPEEX_LT_REVISION@:@SPEEX_LT_AGE@
libspeexdsp_la_LDFLAGS = -no-undefined -version-info @SPEEX_LT_CURRENT@:@SPEEX_LT_REVISION@:@SPEEX_LT_AGE@
-noinst_PROGRAMS = testenc testenc_wb testenc_uwb testdenoise testecho
+noinst_PROGRAMS = testenc testenc_wb testenc_uwb testdenoise testecho testjitter
testenc_SOURCES = testenc.c
testenc_LDADD = libspeex.la
testenc_wb_SOURCES = testenc_wb.c
@@ -43,3 +43,5 @@ testdenoise_SOURCES = testdenoise.c
testdenoise_LDADD = libspeexdsp.la
testecho_SOURCES = testecho.c
testecho_LDADD = libspeexdsp.la
+testjitter_SOURCES = testjitter.c
+testjitter_LDADD = libspeexdsp.la
diff --git a/libspeex/jitter.c b/libspeex/jitter.c
index 5ad7f10..b4246a6 100644
--- a/libspeex/jitter.c
+++ b/libspeex/jitter.c
@@ -398,6 +398,13 @@ void jitter_buffer_put(JitterBuffer *jitter, const JitterBufferPacket *packet)
} else {
late = 0;
}
+
+ /* For some reason, the consumer has failed the last 20 fetches. Make sure this packet is
+ * used to resync. */
+ if (jitter->lost_count>20)
+ {
+ jitter_buffer_reset(jitter);
+ }
/* Only insert the packet if it's not hopelessly late (i.e. totally useless) */
if (jitter->reset_state || GE32(packet->timestamp+packet->span+jitter->delay_step, jitter->pointer_timestamp))
@@ -428,10 +435,6 @@ void jitter_buffer_put(JitterBuffer *jitter, const JitterBufferPacket *packet)
else
speex_free(jitter->packets[i].data);
jitter->packets[i].data=NULL;
- if (jitter->lost_count>20)
- {
- jitter_buffer_reset(jitter);
- }
/*fprintf (stderr, "Buffer is full, discarding earliest frame %d (currently at %d)\n", timestamp, jitter->pointer_timestamp);*/
}
diff --git a/libspeex/testjitter.c b/libspeex/testjitter.c
new file mode 100644
index 0000000..3bcbe2f
--- /dev/null
+++ b/libspeex/testjitter.c
@@ -0,0 +1,75 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <speex/speex_jitter.h>
+#include <stdio.h>
+
+union jbpdata {
+ unsigned int idx;
+ unsigned char data[4];
+};
+
+void synthIn(JitterBufferPacket *in, int idx, int span) {
+ union jbpdata d;
+ d.idx = idx;
+
+ in->data = d.data;
+ in->len = sizeof(d);
+ in->timestamp = idx * 10;
+ in->span = span * 10;
+ in->sequence = idx;
+ in->user_data = 0;
+}
+
+void jitterFill(JitterBuffer *jb) {
+ char buffer[65536];
+ JitterBufferPacket in, out;
+ int i;
+
+ out.data = buffer;
+
+ jitter_buffer_reset(jb);
+
+ for(i=0;i<100;++i) {
+ synthIn(&in, i, 1);
+ jitter_buffer_put(jb, &in);
+
+ out.len = 65536;
+ if (jitter_buffer_get(jb, &out, 10, NULL) != JITTER_BUFFER_OK) {
+ printf("Fill test failed iteration %d\n", i);
+ }
+ if (out.timestamp != i * 10) {
+ printf("Fill test expected %d got %d\n", i*10, out.timestamp);
+ }
+ jitter_buffer_tick(jb);
+ }
+}
+
+int main()
+{
+ char buffer[65536];
+ JitterBufferPacket in, out;
+ int i;
+
+ JitterBuffer *jb = jitter_buffer_init(10);
+
+ out.data = buffer;
+
+ /* Frozen sender case */
+ jitterFill(jb);
+ for(i=0;i<100;++i) {
+ out.len = 65536;
+ jitter_buffer_get(jb, &out, 10, NULL);
+ jitter_buffer_tick(jb);
+ }
+ synthIn(&in, 100, 1);
+ jitter_buffer_put(jb, &in);
+ out.len = 65536;
+ if (jitter_buffer_get(jb, &out, 10, NULL) != JITTER_BUFFER_OK) {
+ printf("Failed frozen sender resynchronize\n");
+ } else {
+ printf("Frozen sender: Jitter %d\n", out.timestamp - 100*10);
+ }
+ return 0;
+}