92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								#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);
							 | 
						||
| 
								 | 
							
								}
							 |