Improve vomp quality under ideal & low bandwidth use

This commit is contained in:
Jeremy Lakeman 2012-12-19 10:38:17 +10:30
parent c5d76a057f
commit 1b1af90924
2 changed files with 30 additions and 38 deletions

View File

@ -52,7 +52,7 @@ struct sched_ent next_packet;
struct profile_total send_packet;
static void overlay_send_packet(struct sched_ent *alarm);
static void overlay_update_queue_schedule(overlay_txqueue *queue, struct overlay_frame *frame);
static int overlay_calc_queue_time(overlay_txqueue *queue, struct overlay_frame *frame);
int overlay_queue_init(){
/* Set default congestion levels for queues */
@ -62,6 +62,7 @@ int overlay_queue_init(){
overlay_tx[i].latencyTarget=1000; /* Keep packets in queue for 1 second by default */
}
/* expire voice/video call packets much sooner, as they just aren't any use if late */
overlay_tx[OQ_ISOCHRONOUS_VOICE].maxLength=20;
overlay_tx[OQ_ISOCHRONOUS_VOICE].latencyTarget=200;
overlay_tx[OQ_ISOCHRONOUS_VIDEO].latencyTarget=200;
return 0;
@ -217,7 +218,7 @@ int overlay_payload_enqueue(struct overlay_frame *p)
if (p->queue==OQ_ISOCHRONOUS_VOICE)
rhizome_saw_voice_traffic();
overlay_update_queue_schedule(queue, p);
overlay_calc_queue_time(queue, p);
return 0;
}
@ -276,21 +277,24 @@ overlay_calc_queue_time(overlay_txqueue *queue, struct overlay_frame *frame){
if (next_allowed_packet==0||next_packet < next_allowed_packet)
next_allowed_packet = next_packet;
}
if (next_allowed_packet==0)
return 0;
}
if (next_packet.alarm==0 || next_allowed_packet < next_packet.alarm){
next_packet.alarm=next_allowed_packet;
// no grace period, send IO ASAP
next_packet.deadline=next_allowed_packet;
ret = 1;
}
if (!next_packet.function){
next_packet.function=overlay_send_packet;
send_packet.name="overlay_send_packet";
next_packet.stats=&send_packet;
}
return ret;
unschedule(&next_packet);
next_packet.alarm=next_allowed_packet;
// small grace period, we want to read incoming IO first
next_packet.deadline=next_allowed_packet+15;
schedule(&next_packet);
}
return 0;
}
static void
@ -431,11 +435,8 @@ overlay_stuff_packet(struct outgoing_packet *packet, overlay_txqueue *queue, tim
if (frame->destination_resolved){
frame->send_copies --;
if (frame->send_copies>0){
if (frame->send_copies>0)
keep_payload=1;
// make sure we don't schedule the next alarm immediately
frame->enqueued_at=gettime_ms();
}
}else{
int i;
frame->broadcast_sent_via[packet->i]=1;
@ -479,9 +480,6 @@ overlay_fill_send_packet(struct outgoing_packet *packet, time_ms_t now) {
overlay_stuff_packet(packet, queue, now);
}
if (next_packet.alarm)
schedule(&next_packet);
if(packet->buffer){
if (ob_position(packet->buffer) > packet->header_length){
@ -514,14 +512,6 @@ static void overlay_send_packet(struct sched_ent *alarm){
overlay_fill_send_packet(&packet, gettime_ms());
}
// update time for next alarm and reschedule
static void overlay_update_queue_schedule(overlay_txqueue *queue, struct overlay_frame *frame){
if (overlay_calc_queue_time(queue, frame)){
unschedule(&next_packet);
schedule(&next_packet);
}
}
int
overlay_tick_interface(int i, time_ms_t now) {
struct outgoing_packet packet;
@ -532,7 +522,7 @@ overlay_tick_interface(int i, time_ms_t now) {
}
if (limit_is_allowed(&overlay_interfaces[i].transfer_limit)){
WARN("Throttling has blocked a tick packet");
//WARN("Throttling has blocked a tick packet");
RETURN(-1);
}

20
vomp.c
View File

@ -227,7 +227,7 @@ char vomp_dtmf_digit_to_char(int digit)
return '?';
}
static int store_jitter_sample(struct jitter_measurements *measurements, int sample_clock, int local_clock){
static int store_jitter_sample(struct jitter_measurements *measurements, int sample_clock, int local_clock, int *delay){
IN();
int i, count=0;
@ -298,6 +298,8 @@ static int store_jitter_sample(struct jitter_measurements *measurements, int sam
if (sample_clock > measurements->max_sample_clock)
measurements->max_sample_clock=sample_clock;
*delay=sample->delta - measurements->sorted_samples[0]->delta;
RETURN(0);
}
@ -307,10 +309,9 @@ static int get_jitter_size(struct jitter_measurements *measurements){
int jitter;
if (i>=measurements->sample_count)
i=measurements->sample_count -1;
do{
jitter=measurements->sorted_samples[i]->delta - measurements->sorted_samples[0]->delta;
i--;
}while(jitter > 1500);
if (jitter < 60)
jitter=60;
RETURN(jitter);
}
@ -582,7 +583,7 @@ static int monitor_call_status(struct vomp_call_state *call)
}
static int monitor_send_audio(struct vomp_call_state *call, int audio_codec, int time, int sequence,
const unsigned char *audio, int audio_length)
const unsigned char *audio, int audio_length, int delay)
{
if (0) DEBUGF("Tell call monitor about audio for call %06x:%06x",
call->local.session,call->remote.session);
@ -595,11 +596,11 @@ static int monitor_send_audio(struct vomp_call_state *call, int audio_codec, int
int jitter_delay = get_jitter_size(&call->jitter);
int msglen = snprintf(msg, 1024,
"\n*%d:AUDIO:%x:%d:%d:%d:%d\n",
"\n*%d:AUDIO:%x:%d:%d:%d:%d:%d\n",
audio_length,
call->local.session,
audio_codec, time, sequence,
jitter_delay);
jitter_delay, delay);
bcopy(audio, &msg[msglen], audio_length);
msglen+=audio_length;
@ -730,15 +731,16 @@ static int vomp_process_audio(struct vomp_call_state *call, overlay_mdp_frame *m
time=call->remote_audio_clock * 20;
int audio_len = mdp->in.payload_length - ofs;
int delay=0;
if (store_jitter_sample(&call->jitter, time, now))
if (store_jitter_sample(&call->jitter, time, now, &delay))
return 0;
/* Pass audio frame to all registered listeners */
if (monitor_socket_count)
monitor_send_audio(call, codec, time, call->remote.sequence,
&mdp->in.payload[ofs],
audio_len);
audio_len, delay);
return 0;
}