From f279257c5465461d88e2d2ec381cc10bd8e726ab Mon Sep 17 00:00:00 2001 From: Andrew Bonney Date: Tue, 4 Jun 2013 09:29:27 +0100 Subject: [PATCH 1/4] Prevent MTU breaches for L16 stereo --- src/audiofilters/l16.c | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/audiofilters/l16.c b/src/audiofilters/l16.c index 646e1b5..70d8b64 100644 --- a/src/audiofilters/l16.c +++ b/src/audiofilters/l16.c @@ -25,10 +25,16 @@ struct EncState { int ptime; int rate; int nchannels; - int nbytes; + int mtu; MSBufferizer *bufferizer; }; +static void enc_update_mtu(struct EncState *s){ + int max_payload = ms_get_payload_max_size(); + // Packet sizes must be exactly divisible by 4 for L16 stereo to work + s->mtu = max_payload - (max_payload % 2*s->nchannels); +} + static void enc_init(MSFilter *f) { struct EncState *s=(struct EncState*)ms_new(struct EncState,1); @@ -37,6 +43,7 @@ static void enc_init(MSFilter *f) s->ptime = 10; s->rate=8000; s->nchannels = 1; + enc_update_mtu(s); f->data=s; }; @@ -48,13 +55,7 @@ static void enc_uninit(MSFilter *f) f->data = 0; }; -static void enc_update(struct EncState *s){ - s->nbytes=(2*s->nchannels*s->rate*s->ptime)/1000; -} - static void enc_preprocess(MSFilter *f){ - struct EncState *s=(struct EncState*)f->data; - enc_update(s); } static void host_to_network(int16_t *buffer, int nsamples){ @@ -77,14 +78,19 @@ static void enc_process(MSFilter *f){ ms_filter_lock(f); ms_bufferizer_put_from_queue(s->bufferizer,f->inputs[0]); - while(ms_bufferizer_get_avail(s->bufferizer)>=s->nbytes) { - mblk_t *om=allocb(s->nbytes,0); - om->b_wptr+=ms_bufferizer_read(s->bufferizer,om->b_wptr,s->nbytes); - host_to_network((int16_t*)om->b_rptr,s->nbytes/2); + int bytes_to_send = 0; + while((bytes_to_send=ms_bufferizer_get_avail(s->bufferizer))>0) { + if (bytes_to_send > s->mtu) { + bytes_to_send = s->mtu; + } + mblk_t *om=allocb(bytes_to_send,0); + om->b_wptr+=ms_bufferizer_read(s->bufferizer,om->b_wptr,bytes_to_send); + host_to_network((int16_t*)om->b_rptr,bytes_to_send/2); mblk_set_timestamp_info(om,s->ts); ms_queue_put(f->outputs[0],om); - s->ts += s->nbytes/(2*s->nchannels); + s->ts += bytes_to_send/(2*s->nchannels); } + ms_filter_unlock(f); }; @@ -92,7 +98,6 @@ static void set_ptime(struct EncState *s, int value){ if (value>0 && value<=100){ s->ptime=value; ms_message("L16 encoder using ptime=%i",value); - enc_update(s); } } @@ -129,6 +134,13 @@ static int enc_set_sr(MSFilter *f, void *arg){ static int enc_set_nchannels(MSFilter *f, void *arg) { struct EncState *s = (struct EncState *)f->data; s->nchannels = *(int *)arg; + enc_update_mtu(s); + return 0; +} + +static int enc_set_mtu(MSFilter *f, void*data){ + struct EncState *s=(struct EncState *)f->data; + enc_update_mtu(s); return 0; } @@ -137,6 +149,7 @@ static MSFilterMethod enc_methods[]={ { MS_FILTER_ADD_FMTP , enc_add_fmtp}, { MS_FILTER_SET_SAMPLE_RATE , enc_set_sr }, { MS_FILTER_SET_NCHANNELS , enc_set_nchannels}, + { MS_FILTER_SET_MTU , enc_set_mtu}, { 0 , NULL } }; -- 1.7.9.5