diff options
author | jm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800> | 2008-04-11 07:48:31 +0400 |
---|---|---|
committer | jm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800> | 2008-04-11 07:48:31 +0400 |
commit | eb717d6a309c475aadf66d8bbb44e31f0997fbef (patch) | |
tree | 5fa271c92dbc1260dfe72dd282d0baeb43171215 | |
parent | d9ca7526e187474bce53b94ca0220f4a39f18baa (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.am | 4 | ||||
-rw-r--r-- | libspeex/jitter.c | 11 | ||||
-rw-r--r-- | libspeex/testjitter.c | 75 |
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; +} |