From cbc5984df86796fa1e52958f7b0eb637a9ac88a2 Mon Sep 17 00:00:00 2001 From: jm Date: Sun, 14 Oct 2007 15:43:33 +0000 Subject: Manual update -- including Speex-specific jitter buffer git-svn-id: http://svn.xiph.org/trunk/speex@13981 0101bb08-14d6-0310-b084-bc0e0c8e3800 --- speexclient/speex_jitter_buffer.c | 85 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 speexclient/speex_jitter_buffer.c (limited to 'speexclient') diff --git a/speexclient/speex_jitter_buffer.c b/speexclient/speex_jitter_buffer.c new file mode 100644 index 0000000..d79f34c --- /dev/null +++ b/speexclient/speex_jitter_buffer.c @@ -0,0 +1,85 @@ +#include + + +void speex_jitter_init(SpeexJitter *jitter, void *decoder, int sampling_rate) +{ + jitter->dec = decoder; + speex_decoder_ctl(decoder, SPEEX_GET_FRAME_SIZE, &jitter->frame_size); + + jitter->packets = jitter_buffer_init(jitter->frame_size); + + speex_bits_init(&jitter->current_packet); + jitter->valid_bits = 0; + +} + +void speex_jitter_destroy(SpeexJitter *jitter) +{ + jitter_buffer_destroy(jitter->packets); + speex_bits_destroy(&jitter->current_packet); +} + +void speex_jitter_put(SpeexJitter *jitter, char *packet, int len, int timestamp) +{ + JitterBufferPacket p; + p.data = packet; + p.len = len; + p.timestamp = timestamp; + p.span = jitter->frame_size; + jitter_buffer_put(jitter->packets, &p); +} + +void speex_jitter_get(SpeexJitter *jitter, spx_int16_t *out, int *current_timestamp) +{ + int i; + int ret; + spx_int32_t activity; + char data[2048]; + JitterBufferPacket packet; + packet.data = data; + + if (jitter->valid_bits) + { + /* Try decoding last received packet */ + ret = speex_decode_int(jitter->dec, &jitter->current_packet, out); + if (ret == 0) + { + jitter_buffer_tick(jitter->packets); + return; + } else { + jitter->valid_bits = 0; + } + } + + ret = jitter_buffer_get(jitter->packets, &packet, NULL); + + if (ret != JITTER_BUFFER_OK) + { + /* No packet found */ + + /*fprintf (stderr, "lost/late frame\n");*/ + /*Packet is late or lost*/ + speex_decode_int(jitter->dec, NULL, out); + } else { + speex_bits_read_from(&jitter->current_packet, packet.data, packet.len); + /* Decode packet */ + ret = speex_decode_int(jitter->dec, &jitter->current_packet, out); + if (ret == 0) + { + jitter->valid_bits = 1; + } else { + /* Error while decoding */ + for (i=0;iframe_size;i++) + out[i]=0; + } + } + speex_decoder_ctl(jitter->dec, SPEEX_GET_ACTIVITY, &activity); + if (activity < 30) + jitter_buffer_update_delay(jitter->packets, &packet, NULL); + jitter_buffer_tick(jitter->packets); +} + +int speex_jitter_get_pointer_timestamp(SpeexJitter *jitter) +{ + return jitter_buffer_get_pointer_timestamp(jitter->packets); +} -- cgit v1.2.3