From 2831507c8d0476cc19e9d6e11a54a3c2edb303c3 Mon Sep 17 00:00:00 2001 From: gardners Date: Tue, 24 Apr 2012 20:26:16 +0930 Subject: [PATCH] Added sample time info to audio packets. Added codec default sample block times. --- vomp.c | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/vomp.c b/vomp.c index 9ff29673..5f2ac8b0 100644 --- a/vomp.c +++ b/vomp.c @@ -221,6 +221,16 @@ int vomp_send_status(vomp_call_state *call,int flags,overlay_mdp_frame *arg) WHY("We should remember the last few audio frames so that we can send more than one in a packet, so that we have implicit preemptive retry of packets. Also helps resolve jitter"); unsigned short *len=&mdp.out.payload_length; unsigned char *p=&mdp.out.payload[0]; + + /* write the sample end-time in milliseconds since call establishment */ + unsigned long long now=overlay_gettime_ms(); + unsigned long long now_rel_call=now-call->create_time; + p[(*len)++]=(now_rel_call>>24)&0xff; + p[(*len)++]=(now_rel_call>>16)&0xff; + p[(*len)++]=(now_rel_call>>8)&0xff; + p[(*len)++]=(now_rel_call>>0)&0xff; + + /* now codec code and sample block */ p[(*len)++]=arg->vompevent.audio_sample_codec; int i; for(i=0;ivompevent.audio_sample_bytes;i++) @@ -290,6 +300,14 @@ int vomp_process_audio(vomp_call_state *call,overlay_mdp_frame *mdp) { int ofs=14; WHYF("got here (payload has %d bytes)",mdp->in.payload_length); + + /* Get end time marker for sample block collection */ + unsigned int e=0; + e=mdp->in.payload[ofs++]<<24; + e|=mdp->in.payload[ofs++]<<16; + e|=mdp->in.payload[ofs++]<<8; + e|=mdp->in.payload[ofs++]<<0; + while(ofsin.payload_length) { int codec=mdp->in.payload[ofs]; @@ -298,12 +316,15 @@ int vomp_process_audio(vomp_call_state *call,overlay_mdp_frame *mdp) if ((ofs+1+vomp_sample_size(codec))>mdp->in.payload_length) break; overlay_mdp_frame arg; - arg.vompevent.audio_sample_starttime=0; - arg.vompevent.audio_sample_endtime=0; arg.vompevent.audio_sample_codec=codec; arg.vompevent.audio_sample_bytes=vomp_sample_size(codec); bcopy(&mdp->in.payload[ofs+1],&arg.vompevent.audio_bytes[0], arg.vompevent.audio_sample_bytes); + arg.vompevent.audio_sample_endtime=e; + /* work out start-time from end-time less duration of included sample(s). + XXX - Assumes only non-adaptive codecs. */ + e-=vomp_codec_timespan(codec); + arg.vompevent.audio_sample_starttime=e+1; /* Pass audio frame to all registered listeners */ vomp_send_status(call,VOMP_TELLINTERESTED|VOMP_SENDAUDIO,&arg); @@ -1033,6 +1054,26 @@ int vomp_sample_size(int c) return -1; } +int vomp_codec_timespan(int c) +{ + switch(c) { + case VOMP_CODEC_NONE: return 1; + case VOMP_CODEC_CODEC2_2400: return 20; + case VOMP_CODEC_CODEC2_1400: return 40; + case VOMP_CODEC_GSMHALF: return 20; + case VOMP_CODEC_GSMFULL: return 20; + case VOMP_CODEC_16SIGNED: return 20; + case VOMP_CODEC_8ULAW: return 20; + case VOMP_CODEC_8ALAW: return 20; + case VOMP_CODEC_DTMF: return 70; + case VOMP_CODEC_ENGAGED: return 20; + case VOMP_CODEC_ONHOLD: return 20; + case VOMP_CODEC_CALLERID: return 0; + } + return -1; +} + + int app_vomp_status(int argc, const char *const *argv, struct command_line_option *o) { overlay_mdp_frame mdp;