12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- #include <speex/speex_jitter.h>
- #include "speex_jitter_buffer.h"
- #ifndef NULL
- #define NULL 0
- #endif
- 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;
- packet.len = 2048;
- 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, jitter->frame_size, 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);
- }
|