X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=ortp_send.c;h=9d244225d39f557fc1a7132b0173e2d8b0269c16;hp=46b3ece763aaed16f8de964a40d5c5c91d10eaf2;hb=639a90049f74b4ce528376afe8ec8e84edf16208;hpb=db34194eaab9819772bd55ea1ab08c719ed8f1c8 diff --git a/ortp_send.c b/ortp_send.c index 46b3ece7..9d244225 100644 --- a/ortp_send.c +++ b/ortp_send.c @@ -133,27 +133,36 @@ static void ortp_shutdown_targets(void) } } -static int need_extra_header(struct audio_format_handler *af, - long unsigned chunks_sent) +static int need_extra_header(long unsigned current_chunk) { - /* FIXME: No need to compute this on every run */ - int mod = conf.ortp_header_interval_arg / (tv2ms(&af->chunk_tv) + 1); - if (mod && (chunks_sent % mod)) + static struct timeval last_header; + struct timeval now, diff; + + if (!current_chunk) + return 0; + gettimeofday(&now, NULL); + tv_diff(&now, &last_header, &diff); + if (tv2ms(&diff) < conf.ortp_header_interval_arg) return 0; + last_header = now; return 1; } -static void ortp_send(struct audio_format_handler *af, long unsigned current_chunk, - long unsigned chunks_sent, const char *buf, size_t len) +static void ortp_send(long unsigned current_chunk, long unsigned chunks_sent, + const char *buf, size_t len) { struct ortp_target *ot, *tmp; size_t sendbuf_len; int header_len = 0; - int packet_type = ORTP_DATA, stream_type = af && af->get_header_info; /* header stream? */ + int packet_type = ORTP_DATA; char *sendbuf, *header_buf = NULL; + struct timeval *chunk_tv; if (self->status != SENDER_ON) return; + chunk_tv = afs_chunk_time(); + if (!chunk_tv) + return; list_for_each_entry_safe(ot, tmp, &targets, node) { if (!ot->session) { ortp_init_session(ot); @@ -162,18 +171,16 @@ static void ortp_send(struct audio_format_handler *af, long unsigned current_chu } if (!ot->chunk_ts) ot->chunk_ts = rtp_session_time_to_ts(ot->session, - tv2ms(&af->chunk_tv)); + tv2ms(chunk_tv)); // PARA_DEBUG_LOG("len: %d, ts: %lu, ts: %d\n", // len, ot->chunk_ts * chunks_sent, ot->chunk_ts); ot->streaming = 1; } if (list_empty(&targets)) return; - if (stream_type) { - header_buf = af->get_header_info(&header_len); - if (!need_extra_header(af, chunks_sent)) - header_len = 0; - } + header_buf = afs_get_header(&header_len); + if (!need_extra_header(current_chunk)) + header_len = 0; sendbuf_len = ORTP_AUDIO_HEADER_LEN + header_len + len; sendbuf = para_malloc(sendbuf_len); if (!current_chunk) @@ -181,8 +188,8 @@ static void ortp_send(struct audio_format_handler *af, long unsigned current_chu else if (header_len) packet_type = ORTP_HEADER; WRITE_PACKET_TYPE(sendbuf, packet_type); - WRITE_CHUNK_TIME(sendbuf, af->chunk_tv.tv_usec); - WRITE_STREAM_TYPE(sendbuf, stream_type); + WRITE_CHUNK_TIME(sendbuf, chunk_tv->tv_usec); + WRITE_STREAM_TYPE(sendbuf, header_buf? 1 : 0); WRITE_HEADER_LEN(sendbuf, header_len); if (header_len) memcpy(sendbuf + ORTP_AUDIO_HEADER_LEN, header_buf, @@ -290,8 +297,7 @@ success: } } -static void ortp_pre_select(__a_unused struct audio_format_handler *af, - __a_unused int *max_fileno, __a_unused fd_set *rfds, +static void ortp_pre_select(__a_unused int *max_fileno, __a_unused fd_set *rfds, __a_unused fd_set *wfds) { return;