1/* Copyright (C) 2002 Jean-Marc Valin 2 File: speex_jitter.h 3 4 Adaptive jitter buffer for Speex 5 6 Redistribution and use in source and binary forms, with or without 7 modification, are permitted provided that the following conditions 8 are met: 9 10 - Redistributions of source code must retain the above copyright 11 notice, this list of conditions and the following disclaimer. 12 13 - Redistributions in binary form must reproduce the above copyright 14 notice, this list of conditions and the following disclaimer in the 15 documentation and/or other materials provided with the distribution. 16 17 - Neither the name of the Xiph.org Foundation nor the names of its 18 contributors may be used to endorse or promote products derived from 19 this software without specific prior written permission. 20 21 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR 25 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 26 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 27 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 28 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 29 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 30 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 31 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 33*/ 34 35/* 36TODO: 37- Add short-term estimate 38- Defensive programming 39 + warn when last returned < last desired (begative buffering) 40 + warn if update_delay not called between get() and tick() or is called twice in a row 41- Linked list structure for holding the packets instead of the current fixed-size array 42 + return memory to a pool 43 + allow pre-allocation of the pool 44 + optional max number of elements 45- Statistics 46 + drift 47 + loss 48 + late 49 + jitter 50 + buffering delay 51*/ 52#ifdef HAVE_CONFIG_H 53#include "config.h" 54#endif 55 56 57#include "arch.h" 58#include "speex/speex_jitter.h" 59#include "os_support.h" 60 61#ifndef NULL 62#define NULL 0 63#endif 64 65#define SPEEX_JITTER_MAX_BUFFER_SIZE 200 /**< Maximum number of packets in jitter buffer */ 66 67#define TSUB(a,b) ((spx_int32_t)((a)-(b))) 68 69#define GT32(a,b) (((spx_int32_t)((a)-(b)))>0) 70#define GE32(a,b) (((spx_int32_t)((a)-(b)))>=0) 71#define LT32(a,b) (((spx_int32_t)((a)-(b)))<0) 72#define LE32(a,b) (((spx_int32_t)((a)-(b)))<=0) 73 74#define ROUND_DOWN(x, step) ((x)<0 ? ((x)-(step)+1)/(step)*(step) : (x)/(step)*(step)) 75 76#define MAX_TIMINGS 40 77#define MAX_BUFFERS 3 78#define TOP_DELAY 40 79 80/** Buffer that keeps the time of arrival of the latest packets */ 81struct TimingBuffer { 82 int filled; /**< Number of entries occupied in "timing" and "counts"*/ 83 int curr_count; /**< Number of packet timings we got (including those we discarded) */ 84 spx_int32_t timing[MAX_TIMINGS]; /**< Sorted list of all timings ("latest" packets first) */ 85 spx_int16_t counts[MAX_TIMINGS]; /**< Order the packets were put in (will be used for short-term estimate) */ 86}; 87 88static void tb_init(struct TimingBuffer *tb) 89{ 90 tb->filled = 0; 91 tb->curr_count = 0; 92} 93 94/* Add the timing of a new packet to the TimingBuffer */ 95static void tb_add(struct TimingBuffer *tb, spx_int16_t timing) 96{ 97 int pos; 98 /* Discard packet that won't make it into the list because they're too early */ 99 if (tb->filled >= MAX_TIMINGS && timing >= tb->timing[tb->filled-1]) 100 { 101 tb->curr_count++; 102 return; 103 } 104 105 /* Find where the timing info goes in the sorted list */ 106 pos = 0; 107 /* FIXME: Do bisection instead of linear search */ 108 while (pos<tb->filled && timing >= tb->timing[pos]) 109 { 110 pos++; 111 } 112 113 speex_assert(pos <= tb->filled && pos < MAX_TIMINGS); 114 115 /* Shift everything so we can perform the insertion */ 116 if (pos < tb->filled) 117 { 118 int move_size = tb->filled-pos; 119 if (tb->filled == MAX_TIMINGS) 120 move_size -= 1; 121 SPEEX_MOVE(&tb->timing[pos+1], &tb->timing[pos], move_size); 122 SPEEX_MOVE(&tb->counts[pos+1], &tb->counts[pos], move_size); 123 } 124 /* Insert */ 125 tb->timing[pos] = timing; 126 tb->counts[pos] = tb->curr_count; 127 128 tb->curr_count++; 129 if (tb->filled<MAX_TIMINGS) 130 tb->filled++; 131} 132 133 134 135/** Jitter buffer structure */ 136struct JitterBuffer_ { 137 spx_uint32_t pointer_timestamp; /**< Timestamp of what we will *get* next */ 138 spx_uint32_t last_returned_timestamp; /**< Useful for getting the next packet with the same timestamp (for fragmented media) */ 139 spx_uint32_t next_stop; /**< Estimated time the next get() will be called */ 140 141 spx_int32_t buffered; /**< Amount of data we think is still buffered by the application (timestamp units)*/ 142 143 JitterBufferPacket packets[SPEEX_JITTER_MAX_BUFFER_SIZE]; /**< Packets stored in the buffer */ 144 spx_uint32_t arrival[SPEEX_JITTER_MAX_BUFFER_SIZE]; /**< Packet arrival time (0 means it was late, even though it's a valid timestamp) */ 145 146 void (*destroy) (void *); /**< Callback for destroying a packet */ 147 148 spx_int32_t delay_step; /**< Size of the steps when adjusting buffering (timestamp units) */ 149 spx_int32_t concealment_size; /**< Size of the packet loss concealment "units" */ 150 int reset_state; /**< True if state was just reset */ 151 int buffer_margin; /**< How many frames we want to keep in the buffer (lower bound) */ 152 int late_cutoff; /**< How late must a packet be for it not to be considered at all */ 153 int interp_requested; /**< An interpolation is requested by speex_jitter_update_delay() */ 154 int auto_adjust; /**< Whether to automatically adjust the delay at any time */ 155 156 struct TimingBuffer _tb[MAX_BUFFERS]; /**< Don't use those directly */ 157 struct TimingBuffer *timeBuffers[MAX_BUFFERS]; /**< Storing arrival time of latest frames so we can compute some stats */ 158 int window_size; /**< Total window over which the late frames are counted */ 159 int subwindow_size; /**< Sub-window size for faster computation */ 160 int max_late_rate; /**< Absolute maximum amount of late packets tolerable (in percent) */ 161 int latency_tradeoff; /**< Latency equivalent of losing one percent of packets */ 162 int auto_tradeoff; /**< Latency equivalent of losing one percent of packets (automatic default) */ 163 164 int lost_count; /**< Number of consecutive lost packets */ 165}; 166 167/** Based on available data, this computes the optimal delay for the jitter buffer. 168 The optimised function is in timestamp units and is: 169 cost = delay + late_factor*[number of frames that would be late if we used that delay] 170 @param tb Array of buffers 171 @param late_factor Equivalent cost of a late frame (in timestamp units) 172 */ 173static spx_int16_t compute_opt_delay(JitterBuffer *jitter) 174{ 175 int i; 176 spx_int16_t opt=0; 177 spx_int32_t best_cost=0x7fffffff; 178 int late = 0; 179 int pos[MAX_BUFFERS]; 180 int tot_count; 181 float late_factor; 182 int penalty_taken = 0; 183 int best = 0; 184 int worst = 0; 185 spx_int32_t deltaT; 186 struct TimingBuffer *tb; 187 188 tb = jitter->_tb; 189 190 /* Number of packet timings we have received (including those we didn't keep) */ 191 tot_count = 0; 192 for (i=0;i<MAX_BUFFERS;i++) 193 tot_count += tb[i].curr_count; 194 if (tot_count==0) 195 return 0; 196 197 /* Compute cost for one lost packet */ 198 if (jitter->latency_tradeoff != 0) 199 late_factor = jitter->latency_tradeoff * 100.0f / tot_count; 200 else 201 late_factor = jitter->auto_tradeoff * jitter->window_size/tot_count; 202 203 /*fprintf(stderr, "late_factor = %f\n", late_factor);*/ 204 for (i=0;i<MAX_BUFFERS;i++) 205 pos[i] = 0; 206 207 /* Pick the TOP_DELAY "latest" packets (doesn't need to actually be late 208 for the current settings) */ 209 for (i=0;i<TOP_DELAY;i++) 210 { 211 int j; 212 int next=-1; 213 int latest = 32767; 214 /* Pick latest amoung all sub-windows */ 215 for (j=0;j<MAX_BUFFERS;j++) 216 { 217 if (pos[j] < tb[j].filled && tb[j].timing[pos[j]] < latest) 218 { 219 next = j; 220 latest = tb[j].timing[pos[j]]; 221 } 222 } 223 if (next != -1) 224 { 225 spx_int32_t cost; 226 227 if (i==0) 228 worst = latest; 229 best = latest; 230 latest = ROUND_DOWN(latest, jitter->delay_step); 231 pos[next]++; 232 233 /* Actual cost function that tells us how bad using this delay would be */ 234 cost = -latest + late_factor*late; 235 /*fprintf(stderr, "cost %d = %d + %f * %d\n", cost, -latest, late_factor, late);*/ 236 if (cost < best_cost) 237 { 238 best_cost = cost; 239 opt = latest; 240 } 241 } else { 242 break; 243 } 244 245 /* For the next timing we will consider, there will be one more late packet to count */ 246 late++; 247 /* Two-frame penalty if we're going to increase the amount of late frames (hysteresis) */ 248 if (latest >= 0 && !penalty_taken) 249 { 250 penalty_taken = 1; 251 late+=4; 252 } 253 } 254 255 deltaT = best-worst; 256 /* This is a default "automatic latency tradeoff" when none is provided */ 257 jitter->auto_tradeoff = 1 + deltaT/TOP_DELAY; 258 /*fprintf(stderr, "auto_tradeoff = %d (%d %d %d)\n", jitter->auto_tradeoff, best, worst, i);*/ 259 260 /* FIXME: Compute a short-term estimate too and combine with the long-term one */ 261 262 /* Prevents reducing the buffer size when we haven't really had much data */ 263 if (tot_count < TOP_DELAY && opt > 0) 264 return 0; 265 return opt; 266} 267 268 269/** Initialise jitter buffer */ 270EXPORT JitterBuffer *jitter_buffer_init(int step_size) 271{ 272 JitterBuffer *jitter = (JitterBuffer*)speex_alloc(sizeof(JitterBuffer)); 273 if (jitter) 274 { 275 int i; 276 spx_int32_t tmp; 277 for (i=0;i<SPEEX_JITTER_MAX_BUFFER_SIZE;i++) 278 jitter->packets[i].data=NULL; 279 jitter->delay_step = step_size; 280 jitter->concealment_size = step_size; 281 /*FIXME: Should this be 0 or 1?*/ 282 jitter->buffer_margin = 0; 283 jitter->late_cutoff = 50; 284 jitter->destroy = NULL; 285 jitter->latency_tradeoff = 0; 286 jitter->auto_adjust = 1; 287 tmp = 4; 288 jitter_buffer_ctl(jitter, JITTER_BUFFER_SET_MAX_LATE_RATE, &tmp); 289 jitter_buffer_reset(jitter); 290 } 291 return jitter; 292} 293 294/** Reset jitter buffer */ 295EXPORT void jitter_buffer_reset(JitterBuffer *jitter) 296{ 297 int i; 298 for (i=0;i<SPEEX_JITTER_MAX_BUFFER_SIZE;i++) 299 { 300 if (jitter->packets[i].data) 301 { 302 if (jitter->destroy) 303 jitter->destroy(jitter->packets[i].data); 304 else 305 speex_free(jitter->packets[i].data); 306 jitter->packets[i].data = NULL; 307 } 308 } 309 /* Timestamp is actually undefined at this point */ 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; 316 317 for (i=0;i<MAX_BUFFERS;i++) 318 { 319 tb_init(&jitter->_tb[i]); 320 jitter->timeBuffers[i] = &jitter->_tb[i]; 321 } 322 /*fprintf (stderr, "reset\n");*/ 323} 324 325/** Destroy jitter buffer */ 326EXPORT void jitter_buffer_destroy(JitterBuffer *jitter) 327{ 328 jitter_buffer_reset(jitter); 329 speex_free(jitter); 330} 331 332/** Take the following timing into consideration for future calculations */ 333static void update_timings(JitterBuffer *jitter, spx_int32_t timing) 334{ 335 if (timing < -32767) 336 timing = -32767; 337 if (timing > 32767) 338 timing = 32767; 339 /* If the current sub-window is full, perform a rotation and discard oldest sub-widow */ 340 if (jitter->timeBuffers[0]->curr_count >= jitter->subwindow_size) 341 { 342 int i; 343 /*fprintf(stderr, "Rotate buffer\n");*/ 344 struct TimingBuffer *tmp = jitter->timeBuffers[MAX_BUFFERS-1]; 345 for (i=MAX_BUFFERS-1;i>=1;i--) 346 jitter->timeBuffers[i] = jitter->timeBuffers[i-1]; 347 jitter->timeBuffers[0] = tmp; 348 tb_init(jitter->timeBuffers[0]); 349 } 350 tb_add(jitter->timeBuffers[0], timing); 351} 352 353/** Compensate all timings when we do an adjustment of the buffering */ 354static void shift_timings(JitterBuffer *jitter, spx_int16_t amount) 355{ 356 int i, j; 357 for (i=0;i<MAX_BUFFERS;i++) 358 { 359 for (j=0;j<jitter->timeBuffers[i]->filled;j++) 360 jitter->timeBuffers[i]->timing[j] += amount; 361 } 362} 363 364 365/** Put one packet into the jitter buffer */ 366EXPORT void jitter_buffer_put(JitterBuffer *jitter, const JitterBufferPacket *packet) 367{ 368 int i,j; 369 int late; 370 /*fprintf (stderr, "put packet %d %d\n", timestamp, span);*/ 371 372 /* Cleanup buffer (remove old packets that weren't played) */ 373 if (!jitter->reset_state) 374 { 375 for (i=0;i<SPEEX_JITTER_MAX_BUFFER_SIZE;i++) 376 { 377 /* Make sure we don't discard a "just-late" packet in case we want to play it next (if we interpolate). */ 378 if (jitter->packets[i].data && LE32(jitter->packets[i].timestamp + jitter->packets[i].span, jitter->pointer_timestamp)) 379 { 380 /*fprintf (stderr, "cleaned (not played)\n");*/ 381 if (jitter->destroy) 382 jitter->destroy(jitter->packets[i].data); 383 else 384 speex_free(jitter->packets[i].data); 385 jitter->packets[i].data = NULL; 386 } 387 } 388 } 389 390 /*fprintf(stderr, "arrival: %d %d %d\n", packet->timestamp, jitter->next_stop, jitter->pointer_timestamp);*/ 391 /* Check if packet is late (could still be useful though) */ 392 if (!jitter->reset_state && LT32(packet->timestamp, jitter->next_stop)) 393 { 394 update_timings(jitter, ((spx_int32_t)packet->timestamp) - ((spx_int32_t)jitter->next_stop) - jitter->buffer_margin); 395 late = 1; 396 } else { 397 late = 0; 398 } 399 400 /* For some reason, the consumer has failed the last 20 fetches. Make sure this packet is 401 * used to resync. */ 402 if (jitter->lost_count>20) 403 { 404 jitter_buffer_reset(jitter); 405 } 406 407 /* Only insert the packet if it's not hopelessly late (i.e. totally useless) */ 408 if (jitter->reset_state || GE32(packet->timestamp+packet->span+jitter->delay_step, jitter->pointer_timestamp)) 409 { 410 411 /*Find an empty slot in the buffer*/ 412 for (i=0;i<SPEEX_JITTER_MAX_BUFFER_SIZE;i++) 413 { 414 if (jitter->packets[i].data==NULL) 415 break; 416 } 417 418 /*No place left in the buffer, need to make room for it by discarding the oldest packet */ 419 if (i==SPEEX_JITTER_MAX_BUFFER_SIZE) 420 { 421 int earliest=jitter->packets[0].timestamp; 422 i=0; 423 for (j=1;j<SPEEX_JITTER_MAX_BUFFER_SIZE;j++) 424 { 425 if (!jitter->packets[i].data || LT32(jitter->packets[j].timestamp,earliest)) 426 { 427 earliest = jitter->packets[j].timestamp; 428 i=j; 429 } 430 } 431 if (jitter->destroy) 432 jitter->destroy(jitter->packets[i].data); 433 else 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);*/ 437 } 438 439 /* Copy packet in buffer */ 440 if (jitter->destroy) 441 { 442 jitter->packets[i].data = packet->data; 443 } else { 444 jitter->packets[i].data=(char*)speex_alloc(packet->len); 445 for (j=0;j<packet->len;j++) 446 jitter->packets[i].data[j]=packet->data[j]; 447 } 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; 455 else 456 jitter->arrival[i] = jitter->next_stop; 457 } 458 459 460} 461 462/** Get one packet from the jitter buffer */ 463EXPORT int jitter_buffer_get(JitterBuffer *jitter, JitterBufferPacket *packet, spx_int32_t desired_span, spx_int32_t *start_offset) 464{ 465 int i; 466 unsigned int j; 467 spx_int16_t opt; 468 469 if (start_offset != NULL) 470 *start_offset = 0; 471 472 /* Syncing on the first call */ 473 if (jitter->reset_state) 474 { 475 int found = 0; 476 /* Find the oldest packet */ 477 spx_uint32_t oldest=0; 478 for (i=0;i<SPEEX_JITTER_MAX_BUFFER_SIZE;i++) 479 { 480 if (jitter->packets[i].data && (!found || LT32(jitter->packets[i].timestamp,oldest))) 481 { 482 oldest = jitter->packets[i].timestamp; 483 found = 1; 484 } 485 } 486 if (found) 487 { 488 jitter->reset_state=0; 489 jitter->pointer_timestamp = oldest; 490 jitter->next_stop = oldest; 491 } else { 492 packet->timestamp = 0; 493 packet->span = jitter->interp_requested; 494 return JITTER_BUFFER_MISSING; 495 } 496 } 497 498 499 jitter->last_returned_timestamp = jitter->pointer_timestamp; 500 501 if (jitter->interp_requested != 0) 502 { 503 packet->timestamp = jitter->pointer_timestamp; 504 packet->span = jitter->interp_requested; 505 506 /* Increment the pointer because it got decremented in the delay update */ 507 jitter->pointer_timestamp += jitter->interp_requested; 508 packet->len = 0; 509 /*fprintf (stderr, "Deferred interpolate\n");*/ 510 511 jitter->interp_requested = 0; 512 513 jitter->buffered = packet->span - desired_span; 514 515 return JITTER_BUFFER_INSERTION; 516 } 517 518 /* Searching for the packet that fits best */ 519 520 /* Search the buffer for a packet with the right timestamp and spanning the whole current chunk */ 521 for (i=0;i<SPEEX_JITTER_MAX_BUFFER_SIZE;i++) 522 { 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)) 524 break; 525 } 526 527 /* If no match, try for an "older" packet that still spans (fully) the current chunk */ 528 if (i==SPEEX_JITTER_MAX_BUFFER_SIZE) 529 { 530 for (i=0;i<SPEEX_JITTER_MAX_BUFFER_SIZE;i++) 531 { 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)) 533 break; 534 } 535 } 536 537 /* If still no match, try for an "older" packet that spans part of the current chunk */ 538 if (i==SPEEX_JITTER_MAX_BUFFER_SIZE) 539 { 540 for (i=0;i<SPEEX_JITTER_MAX_BUFFER_SIZE;i++) 541 { 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)) 543 break; 544 } 545 } 546 547 /* If still no match, try for earliest packet possible */ 548 if (i==SPEEX_JITTER_MAX_BUFFER_SIZE) 549 { 550 int found = 0; 551 spx_uint32_t best_time=0; 552 int best_span=0; 553 int besti=0; 554 for (i=0;i<SPEEX_JITTER_MAX_BUFFER_SIZE;i++) 555 { 556 /* check if packet starts within current chunk */ 557 if (jitter->packets[i].data && LT32(jitter->packets[i].timestamp,jitter->pointer_timestamp+desired_span) && GE32(jitter->packets[i].timestamp,jitter->pointer_timestamp)) 558 { 559 if (!found || LT32(jitter->packets[i].timestamp,best_time) || (jitter->packets[i].timestamp==best_time && GT32(jitter->packets[i].span,best_span))) 560 { 561 best_time = jitter->packets[i].timestamp; 562 best_span = jitter->packets[i].span; 563 besti = i; 564 found = 1; 565 } 566 } 567 } 568 if (found) 569 { 570 i=besti; 571 /*fprintf (stderr, "incomplete: %d %d %d %d\n", jitter->packets[i].timestamp, jitter->pointer_timestamp, chunk_size, jitter->packets[i].span);*/ 572 } 573 } 574 575 /* If we find something */ 576 if (i!=SPEEX_JITTER_MAX_BUFFER_SIZE) 577 { 578 spx_int32_t offset; 579 580 /* We (obviously) haven't lost this packet */ 581 jitter->lost_count = 0; 582 583 /* In this case, 0 isn't as a valid timestamp */ 584 if (jitter->arrival[i] != 0) 585 { 586 update_timings(jitter, ((spx_int32_t)jitter->packets[i].timestamp) - ((spx_int32_t)jitter->arrival[i]) - jitter->buffer_margin); 587 } 588 589 590 /* Copy packet */ 591 if (jitter->destroy) 592 { 593 packet->data = jitter->packets[i].data; 594 packet->len = jitter->packets[i].len; 595 } else { 596 if (jitter->packets[i].len > packet->len) 597 { 598 speex_warning_int("jitter_buffer_get(): packet too large to fit. Size is", jitter->packets[i].len); 599 } else { 600 packet->len = jitter->packets[i].len; 601 } 602 for (j=0;j<packet->len;j++) 603 packet->data[j] = jitter->packets[i].data[j]; 604 /* Remove packet */ 605 speex_free(jitter->packets[i].data); 606 } 607 jitter->packets[i].data = NULL; 608 /* Set timestamp and span (if requested) */ 609 offset = (spx_int32_t)jitter->packets[i].timestamp-(spx_int32_t)jitter->pointer_timestamp; 610 if (start_offset != NULL) 611 *start_offset = offset; 612 else if (offset != 0) 613 speex_warning_int("jitter_buffer_get() discarding non-zero start_offset", offset); 614 615 packet->timestamp = jitter->packets[i].timestamp; 616 jitter->last_returned_timestamp = packet->timestamp; 617 618 packet->span = jitter->packets[i].span; 619 packet->sequence = jitter->packets[i].sequence; 620 packet->user_data = jitter->packets[i].user_data; 621 /* Point to the end of the current packet */ 622 jitter->pointer_timestamp = jitter->packets[i].timestamp+jitter->packets[i].span; 623 624 jitter->buffered = packet->span - desired_span; 625 626 if (start_offset != NULL) 627 jitter->buffered += *start_offset; 628 629 return JITTER_BUFFER_OK; 630 } 631 632 633 /* If we haven't found anything worth returning */ 634 635 /*fprintf (stderr, "not found\n");*/ 636 jitter->lost_count++; 637 /*fprintf (stderr, "m");*/ 638 /*fprintf (stderr, "lost_count = %d\n", jitter->lost_count);*/ 639 640 opt = compute_opt_delay(jitter); 641 642 /* Should we force an increase in the buffer or just do normal interpolation? */ 643 if (opt < 0) 644 { 645 /* Need to increase buffering */ 646 647 /* Shift histogram to compensate */ 648 shift_timings(jitter, -opt); 649 650 packet->timestamp = jitter->pointer_timestamp; 651 packet->span = -opt; 652 /* Don't move the pointer_timestamp forward */ 653 packet->len = 0; 654 655 jitter->buffered = packet->span - desired_span; 656 return JITTER_BUFFER_INSERTION; 657 /*jitter->pointer_timestamp -= jitter->delay_step;*/ 658 /*fprintf (stderr, "Forced to interpolate\n");*/ 659 } else { 660 /* Normal packet loss */ 661 packet->timestamp = jitter->pointer_timestamp; 662 663 desired_span = ROUND_DOWN(desired_span, jitter->concealment_size); 664 packet->span = desired_span; 665 jitter->pointer_timestamp += desired_span; 666 packet->len = 0; 667 668 jitter->buffered = packet->span - desired_span; 669 return JITTER_BUFFER_MISSING; 670 /*fprintf (stderr, "Normal loss\n");*/ 671 } 672 673 674} 675 676EXPORT int jitter_buffer_get_another(JitterBuffer *jitter, JitterBufferPacket *packet) 677{ 678 int i, j; 679 for (i=0;i<SPEEX_JITTER_MAX_BUFFER_SIZE;i++) 680 { 681 if (jitter->packets[i].data && jitter->packets[i].timestamp==jitter->last_returned_timestamp) 682 break; 683 } 684 if (i!=SPEEX_JITTER_MAX_BUFFER_SIZE) 685 { 686 /* Copy packet */ 687 packet->len = jitter->packets[i].len; 688 if (jitter->destroy) 689 { 690 packet->data = jitter->packets[i].data; 691 } else { 692 for (j=0;j<packet->len;j++) 693 packet->data[j] = jitter->packets[i].data[j]; 694 /* Remove packet */ 695 speex_free(jitter->packets[i].data); 696 } 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; 702 return JITTER_BUFFER_OK; 703 } else { 704 packet->data = NULL; 705 packet->len = 0; 706 packet->span = 0; 707 return JITTER_BUFFER_MISSING; 708 } 709} 710 711/* Let the jitter buffer know it's the right time to adjust the buffering delay to the network conditions */ 712static int _jitter_buffer_update_delay(JitterBuffer *jitter, JitterBufferPacket *packet, spx_int32_t *start_offset) 713{ 714 spx_int16_t opt = compute_opt_delay(jitter); 715 /*fprintf(stderr, "opt adjustment is %d ", opt);*/ 716 717 if (opt < 0) 718 { 719 shift_timings(jitter, -opt); 720 721 jitter->pointer_timestamp += opt; 722 jitter->interp_requested = -opt; 723 /*fprintf (stderr, "Decision to interpolate %d samples\n", -opt);*/ 724 } else if (opt > 0) 725 { 726 shift_timings(jitter, -opt); 727 jitter->pointer_timestamp += opt; 728 /*fprintf (stderr, "Decision to drop %d samples\n", opt);*/ 729 } 730 731 return opt; 732} 733 734/* Let the jitter buffer know it's the right time to adjust the buffering delay to the network conditions */ 735EXPORT int jitter_buffer_update_delay(JitterBuffer *jitter, JitterBufferPacket *packet, spx_int32_t *start_offset) 736{ 737 /* If the programmer calls jitter_buffer_update_delay() directly, 738 automatically disable auto-adjustment */ 739 jitter->auto_adjust = 0; 740 741 return _jitter_buffer_update_delay(jitter, packet, start_offset); 742} 743 744/** Get pointer timestamp of jitter buffer */ 745EXPORT int jitter_buffer_get_pointer_timestamp(JitterBuffer *jitter) 746{ 747 return jitter->pointer_timestamp; 748} 749 750EXPORT void jitter_buffer_tick(JitterBuffer *jitter) 751{ 752 /* Automatically-adjust the buffering delay if requested */ 753 if (jitter->auto_adjust) 754 _jitter_buffer_update_delay(jitter, NULL, NULL); 755 756 if (jitter->buffered >= 0) 757 { 758 jitter->next_stop = jitter->pointer_timestamp - jitter->buffered; 759 } else { 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); 762 } 763 jitter->buffered = 0; 764} 765 766EXPORT void jitter_buffer_remaining_span(JitterBuffer *jitter, spx_uint32_t rem) 767{ 768 /* Automatically-adjust the buffering delay if requested */ 769 if (jitter->auto_adjust) 770 _jitter_buffer_update_delay(jitter, NULL, NULL); 771 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; 775} 776 777 778/* Used like the ioctl function to control the jitter buffer parameters */ 779EXPORT int jitter_buffer_ctl(JitterBuffer *jitter, int request, void *ptr) 780{ 781 int count, i; 782 switch(request) 783 { 784 case JITTER_BUFFER_SET_MARGIN: 785 jitter->buffer_margin = *(spx_int32_t*)ptr; 786 break; 787 case JITTER_BUFFER_GET_MARGIN: 788 *(spx_int32_t*)ptr = jitter->buffer_margin; 789 break; 790 case JITTER_BUFFER_GET_AVALIABLE_COUNT: 791 count = 0; 792 for (i=0;i<SPEEX_JITTER_MAX_BUFFER_SIZE;i++) 793 { 794 if (jitter->packets[i].data && LE32(jitter->pointer_timestamp, jitter->packets[i].timestamp)) 795 { 796 count++; 797 } 798 } 799 *(spx_int32_t*)ptr = count; 800 break; 801 case JITTER_BUFFER_SET_DESTROY_CALLBACK: 802 jitter->destroy = (void (*) (void *))ptr; 803 break; 804 case JITTER_BUFFER_GET_DESTROY_CALLBACK: 805 *(void (**) (void *))ptr = jitter->destroy; 806 break; 807 case JITTER_BUFFER_SET_DELAY_STEP: 808 jitter->delay_step = *(spx_int32_t*)ptr; 809 break; 810 case JITTER_BUFFER_GET_DELAY_STEP: 811 *(spx_int32_t*)ptr = jitter->delay_step; 812 break; 813 case JITTER_BUFFER_SET_CONCEALMENT_SIZE: 814 jitter->concealment_size = *(spx_int32_t*)ptr; 815 break; 816 case JITTER_BUFFER_GET_CONCEALMENT_SIZE: 817 *(spx_int32_t*)ptr = jitter->concealment_size; 818 break; 819 case JITTER_BUFFER_SET_MAX_LATE_RATE: 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; 823 break; 824 case JITTER_BUFFER_GET_MAX_LATE_RATE: 825 *(spx_int32_t*)ptr = jitter->max_late_rate; 826 break; 827 case JITTER_BUFFER_SET_LATE_COST: 828 jitter->latency_tradeoff = *(spx_int32_t*)ptr; 829 break; 830 case JITTER_BUFFER_GET_LATE_COST: 831 *(spx_int32_t*)ptr = jitter->latency_tradeoff; 832 break; 833 default: 834 speex_warning_int("Unknown jitter_buffer_ctl request: ", request); 835 return -1; 836 } 837 return 0; 838} 839 840