Changeset 1111:e207f189903a in mediastreamer2
- Timestamp:
- Jul 9, 2010 11:34:39 AM (3 years ago)
- Branch:
- default
- File:
-
- 1 edited
-
src/msspeex.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/msspeex.c
r984 r1111 19 19 20 20 #include "mediastreamer2/msfilter.h" 21 #include "mediastreamer2/msticker.h" 21 22 22 23 #include <speex/speex.h> … … 394 395 int penh; 395 396 int frsz; 396 uint 32_t last_ts;397 uint64_t sample_time; 397 398 void *state; 398 399 } DecState; … … 404 405 s->state=NULL; 405 406 s->penh=1; 406 s-> last_ts=0;407 s->sample_time=0; 407 408 f->data=s; 408 409 } … … 442 443 if (s->penh==1) 443 444 speex_decoder_ctl (s->state, SPEEX_SET_ENH, &s->penh); 445 s->sample_time=0; 444 446 } 445 447 … … 463 465 SpeexBits bits; 464 466 int bytes=s->frsz*2; 467 bool_t bits_initd=FALSE; 465 468 466 speex_bits_init(&bits);467 469 while((im=ms_queue_get(f->inputs[0]))!=NULL){ 468 uint32_t curts=mblk_get_timestamp_info(im);469 470 int rem_bits=(im->b_wptr-im->b_rptr)*8; 471 472 if (s->sample_time==0){ 473 s->sample_time=f->ticker->time; 474 } 470 475 471 speex_bits_reset(&bits); 476 if (!bits_initd) { 477 speex_bits_init(&bits); 478 bits_initd=TRUE; 479 }else speex_bits_reset(&bits); 480 472 481 speex_bits_read_from(&bits,(char*)im->b_rptr,im->b_wptr-im->b_rptr); 473 482 474 475 #if 0 /* does not work very well, revisit later*/476 /* packet loss concealment stuff, for one packet lost477 A better algorithm would be needed to accomodate more478 */479 if (s->last_ts!=0){480 int ts_diff=(int)(curts-s->last_ts);481 if ( ts_diff>160){482 ms_message("Packet missing, trying loss concealment, ts_diff=%i",ts_diff);483 err=speex_decode_int(s->state,NULL,(int16_t*)om->b_wptr);484 om->b_wptr+=320;485 }486 }487 #endif488 483 /* support for multiple frame in one RTP packet */ 489 484 do{ … … 491 486 err=speex_decode_int(s->state,&bits,(int16_t*)om->b_wptr); 492 487 om->b_wptr+=bytes; 493 s->last_ts=curts+s->frsz; 488 494 489 if (err==0){ 495 490 ms_queue_put(f->outputs[0],om); 491 s->sample_time+=20; 496 492 }else { 497 493 if (err==-1) … … 504 500 freemsg(im); 505 501 } 506 speex_bits_destroy(&bits); 502 if (s->sample_time!=0 && f->ticker->time>s->sample_time){ 503 /* we should output a frame but no packet were decoded 504 thus do packet loss concealment*/ 505 om=allocb(bytes,0); 506 err=speex_decode_int(s->state,NULL,(int16_t*)om->b_wptr); 507 om->b_wptr+=bytes; 508 ms_queue_put(f->outputs[0],om); 509 ms_warning("Doing speex packet loss concealment."); 510 s->sample_time+=20; 511 } 512 if (bits_initd) speex_bits_destroy(&bits); 507 513 } 508 514
Note: See TracChangeset
for help on using the changeset viewer.
