X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=ortp_recv.c;h=fca470ed009962384ce324b274790ef02a433a63;hp=287d7064acd4f2ec9cb67672ad6ed4835181224e;hb=05382250dd4d68b4fa32c229104f613c455f5ea6;hpb=1457610326a2f03878d310c15c1884e22eed92d2 diff --git a/ortp_recv.c b/ortp_recv.c index 287d7064..fca470ed 100644 --- a/ortp_recv.c +++ b/ortp_recv.c @@ -1,19 +1,7 @@ /* - * Copyright (C) 2005-2006 Andre Noll + * Copyright (C) 2005-2007 Andre Noll * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Licensed under the GPL v2. For licencing details see COPYING. */ /** \file ortp_recv.c paraslash's ortp receiver */ @@ -68,17 +56,16 @@ uint32_t chunk_ts; static int msg_to_buf(mblk_t *mp, char *buffer, int len) { - int rlen = len; mblk_t *m, *mprev; - int mlen; + size_t mlen, rlen = len; m = mp->b_cont; mprev = mp; while (m != NULL) { - mlen = (int) (m->b_wptr - m->b_rptr); + mlen = m->b_wptr - m->b_rptr; if (mlen <= rlen) { mblk_t *consumed = m; - memcpy (buffer, m->b_rptr, mlen); + memcpy(buffer, m->b_rptr, mlen); /* go to next mblk_t */ mprev->b_cont = m->b_cont; m = m->b_cont; @@ -86,7 +73,7 @@ static int msg_to_buf(mblk_t *mp, char *buffer, int len) freeb (consumed); buffer += mlen; rlen -= mlen; - } else { /*if mlen>rlen */ + } else { memcpy (buffer, m->b_rptr, rlen); m->b_rptr += rlen; return len; @@ -133,6 +120,7 @@ static void ortp_recv_post_select(__a_unused struct sched *s, struct task *t) int packet_type, stream_type; char tmpbuf[CHUNK_SIZE + 3]; unsigned chunk_time; + size_t packet_size; // PARA_INFO_LOG("rn: %p, pord: %p, session: %p\n", rn, pord, pord->session); t->ret = -E_ORTP_RECV_EOF; @@ -169,6 +157,7 @@ static void ortp_recv_post_select(__a_unused struct sched *s, struct task *t) t->ret = -E_ORTP_RECV_EOF; goto err_out; } + packet_size = t->ret; packet_type = READ_PACKET_TYPE(tmpbuf); stream_type = READ_STREAM_TYPE(tmpbuf); chunk_time = READ_CHUNK_TIME(tmpbuf); @@ -183,48 +172,43 @@ static void ortp_recv_post_select(__a_unused struct sched *s, struct task *t) t->ret = -E_ORTP_RECV_EOF; goto err_out; case ORTP_BOF: - PARA_INFO_LOG("bof (%d)\n", t->ret); + PARA_INFO_LOG("bof (%zu)\n", packet_size); pord->have_header = 1; /* fall through */ case ORTP_DATA: if (!pord->have_header && stream_type) /* can't use the data, wait for header */ goto success; - if (t->ret + rn->loaded >= CHUNK_SIZE + ORTP_AUDIO_HEADER_LEN) { - t->ret = -E_OVERRUN; + t->ret = -E_OVERRUN; + if (packet_size + rn->loaded >= CHUNK_SIZE + ORTP_AUDIO_HEADER_LEN) goto err_out; - } - if (t->ret > ORTP_AUDIO_HEADER_LEN) { + if (packet_size > ORTP_AUDIO_HEADER_LEN) { memcpy(rn->buf + rn->loaded, tmpbuf + ORTP_AUDIO_HEADER_LEN, - t->ret - ORTP_AUDIO_HEADER_LEN); - rn->loaded += t->ret - ORTP_AUDIO_HEADER_LEN; + packet_size - ORTP_AUDIO_HEADER_LEN); + rn->loaded += packet_size - ORTP_AUDIO_HEADER_LEN; } goto success; case ORTP_HEADER: header_len = READ_HEADER_LEN(tmpbuf); - PARA_DEBUG_LOG("header packet (%d bytes), header len: %d\n", - t->ret, header_len); + PARA_DEBUG_LOG("header packet (%zu bytes), header len: %d\n", + packet_size, header_len); if (!pord->have_header) { pord->have_header = 1; memcpy(rn->buf, tmpbuf + ORTP_AUDIO_HEADER_LEN, - t->ret - ORTP_AUDIO_HEADER_LEN); - rn->loaded = t->ret - ORTP_AUDIO_HEADER_LEN; + packet_size - ORTP_AUDIO_HEADER_LEN); + rn->loaded = packet_size - ORTP_AUDIO_HEADER_LEN; goto success; } - if (header_len + ORTP_AUDIO_HEADER_LEN > t->ret) { - t->ret = -E_INVALID_HEADER; + t->ret = -E_INVALID_HEADER; + if (header_len + ORTP_AUDIO_HEADER_LEN > packet_size) goto err_out; - } - payload_len = t->ret - ORTP_AUDIO_HEADER_LEN - header_len; -// PARA_INFO_LOG("len: %d header_len: %d, payload_len: %d, loaded: %d\n", ret, -// header_len, payload_len, rn->loaded); - if (rn->loaded + payload_len > CHUNK_SIZE) { - t->ret = -E_OVERRUN; + payload_len = packet_size - ORTP_AUDIO_HEADER_LEN - header_len; + t->ret = -E_OVERRUN; + if (rn->loaded + payload_len > CHUNK_SIZE) goto err_out; - } if (payload_len) memcpy(rn->buf + rn->loaded, tmpbuf - + (t->ret - payload_len), payload_len); + + (packet_size - payload_len), payload_len); rn->loaded += payload_len; goto success; } @@ -261,7 +245,8 @@ static void *ortp_recv_parse_config(int argc, char **argv) { int ret; - struct ortp_recv_args_info *tmp = para_calloc(sizeof(struct ortp_recv_args_info)); + struct ortp_recv_args_info *tmp = + para_calloc(sizeof(struct ortp_recv_args_info)); ret = ortp_recv_cmdline_parser(argc, argv, tmp)? -E_ORTP_SYNTAX : 1; if (ret > 0) @@ -284,11 +269,9 @@ static int ortp_recv_open(struct receiver_node *rn) rtp_session_set_local_addr(pord->session, c->host_arg, c->port_arg); rtp_session_set_remote_addr(pord->session, c->host_arg, c->port_arg); rtp_session_set_payload_type(pord->session, PAYLOAD_AUDIO_CONTINUOUS); - if (c->jitter_compensation_arg) { - rtp_session_enable_adaptive_jitter_compensation(pord->session, TRUE); - rtp_session_set_jitter_compensation(pord->session, + rtp_session_enable_adaptive_jitter_compensation(pord->session, TRUE); + rtp_session_set_jitter_compensation(pord->session, c->jitter_compensation_arg); - } return 1; }