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

github.com/mumble-voip/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>2007-10-14 19:43:33 +0400
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>2007-10-14 19:43:33 +0400
commitcbc5984df86796fa1e52958f7b0eb637a9ac88a2 (patch)
treebc875b93932404ddfa9fe377b70134ad16efeeb6 /speexclient
parenteca2fc1131ea794daab3c1cbf4f00ab27047a47a (diff)
Manual update -- including Speex-specific jitter buffer
git-svn-id: http://svn.xiph.org/trunk/speex@13981 0101bb08-14d6-0310-b084-bc0e0c8e3800
Diffstat (limited to 'speexclient')
-rw-r--r--speexclient/speex_jitter_buffer.c85
1 files changed, 85 insertions, 0 deletions
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 <speex/speex_jitter.h>
+
+
+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;i<jitter->frame_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);
+}