Lines Matching defs:jitter
4 Adaptive jitter buffer for Speex
49 + jitter
65 #define SPEEX_JITTER_MAX_BUFFER_SIZE 200 /**< Maximum number of packets in jitter buffer */
167 /** Based on available data, this computes the optimal delay for the jitter buffer.
173 static spx_int16_t compute_opt_delay(JitterBuffer *jitter)
188 tb = jitter->_tb;
198 if (jitter->latency_tradeoff != 0)
199 late_factor = jitter->latency_tradeoff * 100.0f / tot_count;
201 late_factor = jitter->auto_tradeoff * jitter->window_size/tot_count;
230 latest = ROUND_DOWN(latest, jitter->delay_step);
257 jitter->auto_tradeoff = 1 + deltaT/TOP_DELAY;
258 /*fprintf(stderr, "auto_tradeoff = %d (%d %d %d)\n", jitter->auto_tradeoff, best, worst, i);*/
269 /** Initialise jitter buffer */
272 JitterBuffer *jitter = (JitterBuffer*)speex_alloc(sizeof(JitterBuffer));
273 if (jitter)
278 jitter->packets[i].data=NULL;
279 jitter->delay_step = step_size;
280 jitter->concealment_size = step_size;
282 jitter->buffer_margin = 0;
283 jitter->late_cutoff = 50;
284 jitter->destroy = NULL;
285 jitter->latency_tradeoff = 0;
286 jitter->auto_adjust = 1;
288 jitter_buffer_ctl(jitter, JITTER_BUFFER_SET_MAX_LATE_RATE, &tmp);
289 jitter_buffer_reset(jitter);
291 return jitter;
294 /** Reset jitter buffer */
295 EXPORT void jitter_buffer_reset(JitterBuffer *jitter)
300 if (jitter->packets[i].data)
302 if (jitter->destroy)
303 jitter->destroy(jitter->packets[i].data);
305 speex_free(jitter->packets[i].data);
306 jitter->packets[i].data = NULL;
310 jitter->pointer_timestamp = 0;
311 jitter->next_stop = 0;
312 jitter->reset_state = 1;
313 jitter->lost_count = 0;
314 jitter->buffered = 0;
315 jitter->auto_tradeoff = 32000;
319 tb_init(&jitter->_tb[i]);
320 jitter->timeBuffers[i] = &jitter->_tb[i];
325 /** Destroy jitter buffer */
326 EXPORT void jitter_buffer_destroy(JitterBuffer *jitter)
328 jitter_buffer_reset(jitter);
329 speex_free(jitter);
333 static void update_timings(JitterBuffer *jitter, spx_int32_t timing)
340 if (jitter->timeBuffers[0]->curr_count >= jitter->subwindow_size)
344 struct TimingBuffer *tmp = jitter->timeBuffers[MAX_BUFFERS-1];
346 jitter->timeBuffers[i] = jitter->timeBuffers[i-1];
347 jitter->timeBuffers[0] = tmp;
348 tb_init(jitter->timeBuffers[0]);
350 tb_add(jitter->timeBuffers[0], timing);
354 static void shift_timings(JitterBuffer *jitter, spx_int16_t amount)
359 for (j=0;j<jitter->timeBuffers[i]->filled;j++)
360 jitter->timeBuffers[i]->timing[j] += amount;
365 /** Put one packet into the jitter buffer */
366 EXPORT void jitter_buffer_put(JitterBuffer *jitter, const JitterBufferPacket *packet)
373 if (!jitter->reset_state)
378 if (jitter->packets[i].data && LE32(jitter->packets[i].timestamp + jitter->packets[i].span, jitter->pointer_timestamp))
381 if (jitter->destroy)
382 jitter->destroy(jitter->packets[i].data);
384 speex_free(jitter->packets[i].data);
385 jitter->packets[i].data = NULL;
390 /*fprintf(stderr, "arrival: %d %d %d\n", packet->timestamp, jitter->next_stop, jitter->pointer_timestamp);*/
392 if (!jitter->reset_state && LT32(packet->timestamp, jitter->next_stop))
394 update_timings(jitter, ((spx_int32_t)packet->timestamp) - ((spx_int32_t)jitter->next_stop) - jitter->buffer_margin);
402 if (jitter->lost_count>20)
404 jitter_buffer_reset(jitter);
408 if (jitter->reset_state || GE32(packet->timestamp+packet->span+jitter->delay_step, jitter->pointer_timestamp))
414 if (jitter->packets[i].data==NULL)
421 int earliest=jitter->packets[0].timestamp;
425 if (!jitter->packets[i].data || LT32(jitter->packets[j].timestamp,earliest))
427 earliest = jitter->packets[j].timestamp;
431 if (jitter->destroy)
432 jitter->destroy(jitter->packets[i].data);
434 speex_free(jitter->packets[i].data);
435 jitter->packets[i].data=NULL;
436 /*fprintf (stderr, "Buffer is full, discarding earliest frame %d (currently at %d)\n", timestamp, jitter->pointer_timestamp);*/
440 if (jitter->destroy)
442 jitter->packets[i].data = packet->data;
444 jitter->packets[i].data=(char*)speex_alloc(packet->len);
446 jitter->packets[i].data[j]=packet->data[j];
448 jitter->packets[i].timestamp=packet->timestamp;
449 jitter->packets[i].span=packet->span;
450 jitter->packets[i].len=packet->len;
451 jitter->packets[i].sequence=packet->sequence;
452 jitter->packets[i].user_data=packet->user_data;
453 if (jitter->reset_state || late)
454 jitter->arrival[i] = 0;
456 jitter->arrival[i] = jitter->next_stop;
462 /** Get one packet from the jitter buffer */
463 EXPORT int jitter_buffer_get(JitterBuffer *jitter, JitterBufferPacket *packet, spx_int32_t desired_span, spx_int32_t *start_offset)
473 if (jitter->reset_state)
480 if (jitter->packets[i].data && (!found || LT32(jitter->packets[i].timestamp,oldest)))
482 oldest = jitter->packets[i].timestamp;
488 jitter->reset_state=0;
489 jitter->pointer_timestamp = oldest;
490 jitter->next_stop = oldest;
493 packet->span = jitter->interp_requested;
499 jitter->last_returned_timestamp = jitter->pointer_timestamp;
501 if (jitter->interp_requested != 0)
503 packet->timestamp = jitter->pointer_timestamp;
504 packet->span = jitter->interp_requested;
507 jitter->pointer_timestamp += jitter->interp_requested;
511 jitter->interp_requested = 0;
513 jitter->buffered = packet->span - desired_span;
523 if (jitter->packets[i].data && jitter->packets[i].timestamp==jitter->pointer_timestamp && GE32(jitter->packets[i].timestamp+jitter->packets[i].span,jitter->pointer_timestamp+desired_span))
532 if (jitter->packets[i].data && LE32(jitter->packets[i].timestamp, jitter->pointer_timestamp) && GE32(jitter->packets[i].timestamp+jitter->packets[i].span,jitter->pointer_timestamp+desired_span))
542 if (jitter->packets[i].data && LE32(jitter->packets[i].timestamp, jitter->pointer_timestamp) && GT32(jitter->packets[i].timestamp+jitter->packets[i].span,jitter->pointer_timestamp))
557 if (jitter->packets[i].data && LT32(jitter->packets[i].timestamp,jitter->pointer_timestamp+desired_span) && GE32(jitter->packets[i].timestamp,jitter->pointer_timestamp))
559 if (!found || LT32(jitter->packets[i].timestamp,best_time) || (jitter->packets[i].timestamp==best_time && GT32(jitter->packets[i].span,best_span)))
561 best_time = jitter->packets[i].timestamp;
562 best_span = jitter->packets[i].span;
571 /*fprintf (stderr, "incomplete: %d %d %d %d\n", jitter->packets[i].timestamp, jitter->pointer_timestamp, chunk_size, jitter->packets[i].span);*/
581 jitter->lost_count = 0;
584 if (jitter->arrival[i] != 0)
586 update_timings(jitter, ((spx_int32_t)jitter->packets[i].timestamp) - ((spx_int32_t)jitter->arrival[i]) - jitter->buffer_margin);
591 if (jitter->destroy)
593 packet->data = jitter->packets[i].data;
594 packet->len = jitter->packets[i].len;
596 if (jitter->packets[i].len > packet->len)
598 speex_warning_int("jitter_buffer_get(): packet too large to fit. Size is", jitter->packets[i].len);
600 packet->len = jitter->packets[i].len;
603 packet->data[j] = jitter->packets[i].data[j];
605 speex_free(jitter->packets[i].data);
607 jitter->packets[i].data = NULL;
609 offset = (spx_int32_t)jitter->packets[i].timestamp-(spx_int32_t)jitter->pointer_timestamp;
615 packet->timestamp = jitter->packets[i].timestamp;
616 jitter->last_returned_timestamp = packet->timestamp;
618 packet->span = jitter->packets[i].span;
619 packet->sequence = jitter->packets[i].sequence;
620 packet->user_data = jitter->packets[i].user_data;
622 jitter->pointer_timestamp = jitter->packets[i].timestamp+jitter->packets[i].span;
624 jitter->buffered = packet->span - desired_span;
627 jitter->buffered += *start_offset;
636 jitter->lost_count++;
638 /*fprintf (stderr, "lost_count = %d\n", jitter->lost_count);*/
640 opt = compute_opt_delay(jitter);
648 shift_timings(jitter, -opt);
650 packet->timestamp = jitter->pointer_timestamp;
655 jitter->buffered = packet->span - desired_span;
657 /*jitter->pointer_timestamp -= jitter->delay_step;*/
661 packet->timestamp = jitter->pointer_timestamp;
663 desired_span = ROUND_DOWN(desired_span, jitter->concealment_size);
665 jitter->pointer_timestamp += desired_span;
668 jitter->buffered = packet->span - desired_span;
676 EXPORT int jitter_buffer_get_another(JitterBuffer *jitter, JitterBufferPacket *packet)
681 if (jitter->packets[i].data && jitter->packets[i].timestamp==jitter->last_returned_timestamp)
687 packet->len = jitter->packets[i].len;
688 if (jitter->destroy)
690 packet->data = jitter->packets[i].data;
693 packet->data[j] = jitter->packets[i].data[j];
695 speex_free(jitter->packets[i].data);
697 jitter->packets[i].data = NULL;
698 packet->timestamp = jitter->packets[i].timestamp;
699 packet->span = jitter->packets[i].span;
700 packet->sequence = jitter->packets[i].sequence;
701 packet->user_data = jitter->packets[i].user_data;
711 /* Let the jitter buffer know it's the right time to adjust the buffering delay to the network conditions */
712 static int _jitter_buffer_update_delay(JitterBuffer *jitter, JitterBufferPacket *packet, spx_int32_t *start_offset)
714 spx_int16_t opt = compute_opt_delay(jitter);
719 shift_timings(jitter, -opt);
721 jitter->pointer_timestamp += opt;
722 jitter->interp_requested = -opt;
726 shift_timings(jitter, -opt);
727 jitter->pointer_timestamp += opt;
734 /* Let the jitter buffer know it's the right time to adjust the buffering delay to the network conditions */
735 EXPORT int jitter_buffer_update_delay(JitterBuffer *jitter, JitterBufferPacket *packet, spx_int32_t *start_offset)
739 jitter->auto_adjust = 0;
741 return _jitter_buffer_update_delay(jitter, packet, start_offset);
744 /** Get pointer timestamp of jitter buffer */
745 EXPORT int jitter_buffer_get_pointer_timestamp(JitterBuffer *jitter)
747 return jitter->pointer_timestamp;
750 EXPORT void jitter_buffer_tick(JitterBuffer *jitter)
753 if (jitter->auto_adjust)
754 _jitter_buffer_update_delay(jitter, NULL, NULL);
756 if (jitter->buffered >= 0)
758 jitter->next_stop = jitter->pointer_timestamp - jitter->buffered;
760 jitter->next_stop = jitter->pointer_timestamp;
761 speex_warning_int("jitter buffer sees negative buffering, your code might be broken. Value is ", jitter->buffered);
763 jitter->buffered = 0;
766 EXPORT void jitter_buffer_remaining_span(JitterBuffer *jitter, spx_uint32_t rem)
769 if (jitter->auto_adjust)
770 _jitter_buffer_update_delay(jitter, NULL, NULL);
772 if (jitter->buffered < 0)
773 speex_warning_int("jitter buffer sees negative buffering, your code might be broken. Value is ", jitter->buffered);
774 jitter->next_stop = jitter->pointer_timestamp - rem;
778 /* Used like the ioctl function to control the jitter buffer parameters */
779 EXPORT int jitter_buffer_ctl(JitterBuffer *jitter, int request, void *ptr)
785 jitter->buffer_margin = *(spx_int32_t*)ptr;
788 *(spx_int32_t*)ptr = jitter->buffer_margin;
794 if (jitter->packets[i].data && LE32(jitter->pointer_timestamp, jitter->packets[i].timestamp))
802 jitter->destroy = (void (*) (void *))ptr;
805 *(void (**) (void *))ptr = jitter->destroy;
808 jitter->delay_step = *(spx_int32_t*)ptr;
811 *(spx_int32_t*)ptr = jitter->delay_step;
814 jitter->concealment_size = *(spx_int32_t*)ptr;
817 *(spx_int32_t*)ptr = jitter->concealment_size;
820 jitter->max_late_rate = *(spx_int32_t*)ptr;
821 jitter->window_size = 100*TOP_DELAY/jitter->max_late_rate;
822 jitter->subwindow_size = jitter->window_size/MAX_BUFFERS;
825 *(spx_int32_t*)ptr = jitter->max_late_rate;
828 jitter->latency_tradeoff = *(spx_int32_t*)ptr;
831 *(spx_int32_t*)ptr = jitter->latency_tradeoff;