module-rtp: add timer for ck requests

Scale RTP timestamps against the clock, allow some jitter.
Make method to query current RTP timestamps.
This commit is contained in:
Wim Taymans 2023-03-07 09:00:40 +01:00
parent 8e5b9da177
commit c5effbd979
5 changed files with 181 additions and 25 deletions

View file

@ -266,13 +266,14 @@ static void process_audio_capture(void *data)
wanted = size / stride;
filled = spa_ringbuffer_get_write_index(&impl->ring, &expected_timestamp);
if (SPA_LIKELY(impl->io_position))
timestamp = impl->io_position->clock.position;
else
if (SPA_LIKELY(impl->io_position)) {
uint32_t rate = impl->io_position->clock.rate.denom;
timestamp = impl->io_position->clock.position * impl->rate / rate;
} else
timestamp = expected_timestamp;
if (impl->have_sync) {
if (expected_timestamp != timestamp) {
if (SPA_ABS((int32_t)expected_timestamp - (int32_t)timestamp) > 32) {
pw_log_warn("expected %u != timestamp %u", expected_timestamp, timestamp);
impl->have_sync = false;
} else if (filled + wanted > (int32_t)(BUFFER_SIZE / stride)) {

View file

@ -466,3 +466,16 @@ int rtp_stream_receive_packet(struct rtp_stream *s, uint8_t *buffer, size_t len)
struct impl *impl = (struct impl*)s;
return impl->receive_rtp(impl, buffer, len);
}
uint64_t rtp_stream_get_time(struct rtp_stream *s, uint64_t *rate)
{
struct impl *impl = (struct impl*)s;
struct spa_io_position *pos = impl->io_position;
if (pos == NULL)
return -EIO;
*rate = impl->rate;
return pos->clock.position * impl->rate *
pos->clock.rate.num / pos->clock.rate.denom;
}

View file

@ -42,6 +42,8 @@ void rtp_stream_destroy(struct rtp_stream *s);
int rtp_stream_receive_packet(struct rtp_stream *s, uint8_t *buffer, size_t len);
uint64_t rtp_stream_get_time(struct rtp_stream *s, uint64_t *rate);
#ifdef __cplusplus
}