static void receiver_process(MSFilter * f) { ReceiverData *d = (ReceiverData *) f->data; mblk_t *m; uint32_t timestamp; if (d->session == NULL) return; if (d->reset_jb){ ms_message("Reseting jitter buffer"); rtp_session_resync(d->session); d->reset_jb=FALSE; } if (d->starting){ PayloadType *pt=rtp_profile_get_payload( rtp_session_get_profile(d->session), rtp_session_get_recv_payload_type(d->session)); if (pt && pt->type!=PAYLOAD_VIDEO) rtp_session_flush_sockets(d->session); d->starting=FALSE; } timestamp = (uint32_t) (f->ticker->time * (d->rate/1000)); while ((m = rtp_session_recvm_with_ts(d->session, timestamp)) != NULL) { mblk_set_timestamp_info(m, rtp_get_timestamp(m)); mblk_set_marker_info(m, rtp_get_markbit(m)); mblk_set_cseq(m, rtp_get_seqnumber(m)); rtp_get_payload(m,&m->b_rptr); ms_queue_put(f->outputs[0], m); } }
static void filter_process(MSFilter *f){ isac_decoder_t* obj = (isac_decoder_t*)f->data; mblk_t* im; int count = 0; im = ms_queue_get( f->inputs[0] ); while( im != NULL ){ decode(f, im); freemsg(im); count++; im = ms_queue_get( f->inputs[0] ); } if( ms_concealer_context_is_concealement_required(obj->plc_ctx, f->ticker->time) ) { WebRtc_Word16 flen = (obj->ptime == 30) ? ISAC_30MS_SAMPLE_COUNT : ISAC_60MS_SAMPLE_COUNT; mblk_t* plc_blk = allocb(flen*2, 0 ); // ms_message("PLC for %d ms", obj->ptime); // interpolate 1 frame for 30ms ptime, 2 frames for 60ms WebRtc_Word16 ret = WebRtcIsacfix_DecodePlc(obj->isac, (WebRtc_Word16*)plc_blk->b_wptr, (obj->ptime == 30) ? 1 : 2); if( ret < 0 ) { ms_error("WebRtcIsacfix_DecodePlc error: %d", WebRtcIsacfix_GetErrorCode(obj->isac) ); freeb(plc_blk); } else { plc_blk->b_wptr += ret*2; obj->seq_nb++; // insert this interpolated block into the output, with correct args: mblk_set_cseq(plc_blk, obj->seq_nb ); mblk_set_plc_flag(plc_blk, 1); // this one's a PLC packet ms_queue_put(f->outputs[0], plc_blk); ms_concealer_inc_sample_time(obj->plc_ctx, f->ticker->time, obj->ptime, FALSE); } } }