Changeset 1111:e207f189903a in mediastreamer2


Ignore:
Timestamp:
Jul 9, 2010 11:34:39 AM (3 years ago)
Author:
Simon Morlat <simon.morlat@…>
Branch:
default
Message:

implement PLC on speex decoder

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/msspeex.c

    r984 r1111  
    1919 
    2020#include "mediastreamer2/msfilter.h" 
     21#include "mediastreamer2/msticker.h" 
    2122 
    2223#include <speex/speex.h> 
     
    394395        int penh; 
    395396        int frsz; 
    396         uint32_t last_ts; 
     397        uint64_t sample_time; 
    397398        void *state; 
    398399} DecState; 
     
    404405        s->state=NULL; 
    405406        s->penh=1; 
    406         s->last_ts=0; 
     407        s->sample_time=0; 
    407408        f->data=s; 
    408409} 
     
    442443        if (s->penh==1) 
    443444                speex_decoder_ctl (s->state, SPEEX_SET_ENH, &s->penh); 
     445        s->sample_time=0; 
    444446} 
    445447 
     
    463465        SpeexBits bits; 
    464466        int bytes=s->frsz*2; 
     467        bool_t bits_initd=FALSE; 
    465468         
    466         speex_bits_init(&bits); 
    467469        while((im=ms_queue_get(f->inputs[0]))!=NULL){ 
    468                 uint32_t curts=mblk_get_timestamp_info(im); 
    469470                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                } 
    470475                 
    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                 
    472481                speex_bits_read_from(&bits,(char*)im->b_rptr,im->b_wptr-im->b_rptr); 
    473482                 
    474  
    475 #if 0 /* does not work very well, revisit later*/ 
    476                 /* packet loss concealment stuff, for one packet lost  
    477                         A better algorithm would be needed to accomodate more 
    478                 */ 
    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 #endif 
    488483                /* support for multiple frame  in one RTP packet */ 
    489484                do{ 
     
    491486                        err=speex_decode_int(s->state,&bits,(int16_t*)om->b_wptr); 
    492487                        om->b_wptr+=bytes; 
    493                         s->last_ts=curts+s->frsz; 
     488 
    494489                        if (err==0){ 
    495490                                ms_queue_put(f->outputs[0],om); 
     491                                s->sample_time+=20; 
    496492                        }else { 
    497493                                if (err==-1) 
     
    504500                freemsg(im); 
    505501        } 
    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); 
    507513} 
    508514 
Note: See TracChangeset for help on using the changeset viewer.